Python 使用不同的日期时间频率连接数据帧

Python 使用不同的日期时间频率连接数据帧,python,datetime,pandas,Python,Datetime,Pandas,我有一些稀疏的高频数据(间隔不均匀)和一些低频数据(每天)。 如果该数据在当天出现,我如何加入该数据并将相应的低频数据列附加到高频数据中 一种方法是创建一个自定义应用函数,检查每个数据的YMD并查找相应的低频数据,但这似乎效率很低 下面是一个示例数据帧,它演示了问题: df1 = DataFrame(dict(date1 = date_range(start='20100101', periods=48, freq='H'),value1=range(48))) df2 = DataFrame(

我有一些稀疏的高频数据(间隔不均匀)和一些低频数据(每天)。
如果该数据在当天出现,我如何加入该数据并将相应的低频数据列附加到高频数据中

一种方法是创建一个自定义应用函数,检查每个数据的YMD并查找相应的低频数据,但这似乎效率很低

下面是一个示例数据帧,它演示了问题:

df1 = DataFrame(dict(date1 = date_range(start='20100101', periods=48, freq='H'),value1=range(48)))
df2 = DataFrame(dict(date2 = date_range(start='20100101', periods=2, freq='D'),value2=range(2)))
我试过pd.merge和pd.join,但它们不匹配,也不生成NaN

merge(df1,df2,left_on='date1',right_on='date2',how='outer')

                 date1  value1      date2  value2
0  2010-01-01 00:00:00       0 2010-01-01       0
1  2010-01-01 01:00:00       1        NaT     NaN
2  2010-01-01 02:00:00       2        NaT     NaN
3  2010-01-01 03:00:00       3        NaT     NaN
...
1  2010-01-01 01:00:00       1 2010-01-02       1
24 2010-01-02 00:00:00      24        NaT     NaN
25 2010-01-02 01:00:00      25        NaT     NaN
...
30 2010-01-02 06:00:00      30        NaT     NaN
31 2010-01-02 07:00:00      31        NaT     NaN
我希望的输出值1上的所有值为0,2上的所有值为1:

                 date1  value1      date2  value2
0  2010-01-01 00:00:00       0 2010-01-01     0
1  2010-01-01 01:00:00       1 2010-01-01     0
2  2010-01-01 02:00:00       2 2010-01-01     0
3  2010-01-01 03:00:00       3 2010-01-01     0
...
29 2010-01-02 05:00:00      29 2010-01-02     1
30 2010-01-02 06:00:00      30 2010-01-02     1
31 2010-01-02 07:00:00      31 2010-01-02     1

注意:可以通过合并(假设没有重叠列)超级干净地执行此操作:


原始答案,我认为可能更有效。要使用重新索引执行此操作:

为了方便起见,我们将date2设置为索引:

In [11]: df2 = df2.set_index('date2')
In [14]: df1['value2'] = df2.reindex(pd.DatetimeIndex(df1.date1).normalize()).values

In [15]: df1.head()
Out[15]:
                date1  value1  value2
0 2010-01-01 00:00:00       0       0
1 2010-01-01 01:00:00       1       0
2 2010-01-01 02:00:00       2       0
3 2010-01-01 03:00:00       3       0
4 2010-01-01 04:00:00       4       0
现在,在一天开始时重新编制索引(使用normalize,在0.15中,您将能够使用
.dt.normalize()
):


也许您正在寻找重采样?如果您给出两个示例(小)数据帧(每个数据帧有几行)以及您正在寻找的所需输出,这会有所帮助。“现在这个问题太含糊了。”安德伊海登对此表示抱歉,补充道example@wflynny我试过pd.merge和df1。join@Envy那好多了,谢谢+1如果我的低频率数据不在几天之内,有没有办法让它正常工作?例如,如果我的低频数据是每月一次,或者是每两周一次,normalize似乎不接受任何参数。@是的。方法是
。to_period('M')
,而不是
normalize()
(也应该与'2W'一起使用,我认为您还可以指定它的日期W-SUN等。请参阅)
In [12]: pd.DatetimeIndex(df1.date1).normalize()
Out[12]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2010-01-01, ..., 2010-01-02]
Length: 48, Freq: None, Timezone: None

In [13]: df2.reindex(pd.DatetimeIndex(df1.date1).normalize()).head()
Out[13]:
            value2
2010-01-01       0
2010-01-01       0
2010-01-01       0
2010-01-01       0
2010-01-01       0
In [14]: df1['value2'] = df2.reindex(pd.DatetimeIndex(df1.date1).normalize()).values

In [15]: df1.head()
Out[15]:
                date1  value1  value2
0 2010-01-01 00:00:00       0       0
1 2010-01-01 01:00:00       1       0
2 2010-01-01 02:00:00       2       0
3 2010-01-01 03:00:00       3       0
4 2010-01-01 04:00:00       4       0