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

Python 将数据帧与分钟和日期索引相结合,python,pandas,merge,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:

假设我有以下数据帧;一个是以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

是否有任何仅基于日期的合并方法将每日数据拉入分钟数据?

选项1
如果您的数据帧是按索引排序的,那么
pd.merge\u 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

选项1
如果您的数据帧是按索引排序的,那么
pd.merge\u 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

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

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