重采样后合并熊猫数据帧

Posted

技术标签:

【中文标题】重采样后合并熊猫数据帧【英文标题】: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

【问题讨论】:

【参考方案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

【讨论】:

很抱歉,我看不出这是如何回答问题的

以上是关于重采样后合并熊猫数据帧的主要内容,如果未能解决你的问题,请参考以下文章

熊猫结合了滚动和重采样

熊猫时间序列重采样和插值一起

带有熊猫重采样的额外箱

时间序列重采样错误 - 熊猫列中没有日期索引

使用重采样来对齐熊猫中的多个时间序列

如何理解熊猫重采样方法中的封闭和标签参数?