重新采样后合并p​​andas DataFrames

时间:2018-06-07 06:10:29

标签: python pandas datetime dataframe merge

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我认为遵循代码库可以实现您的任务。

>>> 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