【问题标题】:merging pandas DataFrames after resampling重采样后合并熊猫数据帧
【发布时间】:2018-11-16 22:39:51
【问题描述】:

我有一个带有日期时间索引的 DataFrame。

df1=pd.DataFrame(index=pd.date_range('20100201', periods=24, freq='8h3min'),
                data=np.random.rand(24),columns=['Rubbish'])
df1.index=df1.index.to_datetime()

我想重新采样这个 DataFrame,如下所示:

df1=df1.resample('7D').agg(np.median)

然后我有另一个 DataFrame,具有不同频率的索引并从不同的偏移小时开始

df2=pd.DataFrame(index=pd.date_range('20100205', periods=24, freq='6h3min'),
                data=np.random.rand(24),columns=['Rubbish'])
df2.index=df2.index.to_datetime()
df2=df2.resample('7D').agg(np.median)

这些操作独立运行良好,但是当我尝试使用

合并结果时
print(pd.merge(df1,df2,right_index=True,left_index=True,how='outer'))

我明白了:

Rubbish_x  Rubbish_y
2010-02-01   0.585986        NaN
2010-02-05        NaN   0.423316
2010-02-08   0.767499        NaN

虽然我想用相同的偏移量重新采样,并在合并后得到以下结果

            Rubbish_x  Rubbish_y
2010-02-01   AVALUE        AVALUE
2010-02-08   AVALUE        AVALUE

我尝试了以下方法,但它只生成 nans

df2.reindex(df1.index)

print(pd.merge(df1,df2,right_index=True,left_index=True,how='outer'))

我必须坚持pandas 0.20.1

我试过mergeas_of

df1.index
Out[48]: Index([2015-03-24, 2015-03-31, 2015-04-07, 2015-04-14, 2015-04-21, 2015-04-28], dtype='object')

df2.index
Out[49]: Index([2015-03-24, 2015-03-31, 2015-04-07, 2015-04-14, 2015-04-21, 2015-04-28], dtype='object')
output=pd.merge_asof(df1,df2,left_index=True,right_index=True)

但它会因以下回溯而崩溃

Traceback (most recent call last):


TypeError: 'NoneType' object is not callable

【问题讨论】:

    标签: python pandas datetime dataframe merge


    【解决方案1】:

    我相信需要merge_asof:

    print(pd.merge_asof(df1,df2,right_index=True,left_index=True))
                Rubbish_x  Rubbish_y
    2010-02-01   0.446505        NaN
    2010-02-08   0.474330   0.606826
    

    或参数method='nearest'reindex

    df2 = df2.reindex(df1.index, method='nearest')
    print (df2)
                 Rubbish
    2010-02-01  0.415248
    2010-02-08  0.415248
    
    print(pd.merge(df1,df2,right_index=True,left_index=True,how='outer'))
                Rubbish_x  Rubbish_y
    2010-02-01   0.431966   0.415248
    2010-02-08   0.279121   0.415248
    

    【讨论】:

    • 我已经编辑了答案,mergeasof 有问题
    • @00__00__00 - 嗯,如果有相同的索引值,那么merge 就足够了,不需要merge_asof
    • @00__00__00 - 超级:)
    • 其实还是有问题。只要 df2 的第一个索引在 df1 的第一个索引之后,它就可以正常工作。如果不是这种情况,我仍然会得到不一致的索引,就像问题中一样
    • 00__00__00 hmmm,似乎两个索引通常不匹配。那么什么是规则,可以指定它们吗?我有一个想法 - 将 method='nearest' 更改为 method='ffill' 或 method='bfill'。
    【解决方案2】:

    我认为遵循代码库可以完成您的任务。

    >>> index = pd.date_range('1/1/2000', periods=9, freq='T')
    >>> series = pd.Series(range(9), index=index)
    >>> series
    2000-01-01 00:00:00    0
    2000-01-01 00:01:00    1
    2000-01-01 00:02:00    2
    2000-01-01 00:03:00    3
    2000-01-01 00:04:00    4
    2000-01-01 00:05:00    5
    2000-01-01 00:06:00    6
    2000-01-01 00:07:00    7
    2000-01-01 00:08:00    8
    Freq: T, dtype: int64
    
    >>> series.resample('3T').sum()
    2000-01-01 00:00:00     3
    2000-01-01 00:03:00    12
    2000-01-01 00:06:00    21
    Freq: 3T, dtype: int64
    

    https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.DataFrame.resample.html

    【讨论】:

    • 很抱歉,我看不出这是如何回答问题的
    猜你喜欢
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2017-10-09
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多