将数据帧与分钟和日期索引相结合

时间:2018-03-08 20:57:00

标签: python pandas merge

说我有以下数据帧;一个数据间隔为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

是否有任何基于日期合并的方式将日常数据转化为微小数据?

2 个答案:

答案 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
如果没有,那么您可以使用mergedf_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