说我有以下数据帧;一个数据间隔为1分钟,另一个数据间隔为每日数据。
>>> df_1 = pd.DataFrame({'A':[1,2,3],
'B':[4,5,6],
'C':[7,8,9]},
index=pd.to_datetime(['2017-01-01 00:01:00', '2017-01-01 00:02:00', '2017-01-02 00:01:00']))
>>> df_1
A B C
2017-01-01 00:01:00 1 4 7
2017-01-01 00:02:00 2 5 8
2017-01-02 00:01:00 3 6 9
>>> df_2 = pd.DataFrame({'D':['ON','OFF']},
index=pd.to_datetime(['2017-01-01', '2017-01-02']))
>>> df_2
D
2017-01-01 ON
2017-01-02 OFF
我想合并它们,以便df_2中的数据仅按日期拉入df_1,如下所示。
>>> df_merge = pd.merge(df_1, df_2)
>>> df_merge
A B C D
2017-01-01 00:01:00 1 4 7 ON
2017-01-01 00:02:00 2 5 8 ON
2017-01-02 00:01:00 3 6 9 OFF
是否有任何基于日期合并的方式将日常数据转化为微小数据?
答案 0 :(得分:3)
使用reindex
df_1['D']=df_2.reindex(df_1.index,method='nearest')
df_1
Out[184]:
A B C D
2017-01-01 00:01:00 1 4 7 ON
2017-01-01 00:02:00 2 5 8 ON
2017-01-02 00:01:00 3 6 9 OFF
答案 1 :(得分:2)
选项1
如果您的数据框按索引排序,那么pd.merge_asof
也应该有效:
pd.merge_asof(df_1, df_2, left_index=True, right_index=True)
A B C D
2017-01-01 00:01:00 1 4 7 ON
2017-01-01 00:02:00 2 5 8 ON
2017-01-02 00:01:00 3 6 9 OFF
选项2
如果没有,那么您可以使用merge
在df_1
索引的覆盖日期构建的临时列上构建一般解决方案:
df_1.assign(temp=df_1.index.floor('D')).merge(
df_2, left_on='temp', right_index=True
).drop('temp', 1)
A B C D
2017-01-01 00:01:00 1 4 7 ON
2017-01-01 00:02:00 2 5 8 ON
2017-01-02 00:01:00 3 6 9 OFF
选项3
使用concat
:
idx = df_1.index
pd.concat([df_1.set_index(df_1.index.floor('D')), df_2], 1).set_index(idx)
A B C D
2017-01-01 00:01:00 1 4 7 ON
2017-01-01 00:02:00 2 5 8 ON
2017-01-02 00:01:00 3 6 9 OFF