2014-10-02 47 views
1

我有一些稀疏的高频数据(不均匀间隔)和一些低频数据(每日)。
如何加入此数据并在相应的低频数据列中附加相应的低频数据列,如果该数据列在当天?加入具有不同日期时间频率的数据帧

一种方法是创建一个自定义应用函数并检查每个数据的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 

我希望的应有值2输出的一切一号和1一切二号0:

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

Perh aps你正在寻找resample? – 2014-10-02 22:52:59

+0

如果您给出两个示例(小)数据框(如每行数据)以及所需的输出,它会有所帮助。目前这个问题太模糊了。 – 2014-10-02 23:27:18

+0

@AndyHayden,对不起,添加了一个例子 – eengineer 2014-10-02 23:53:53

回答

2

注意:您可以合并干净做到这一点超(假设没有重叠列):

In [41]: df1['date2'] = pd.DatetimeIndex(df1['date1']).normalize() 

In [42]: pd.merge(df1, df2).head() 
Out[42]: 
       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 
4 2010-01-01 04:00:00  4 2010-01-01  0 

原来的答复,我认为可以效率更高。是一个重新索引要做到这一点:

只是为了让事情变得更容易让我们设置于date2作为索引:

In [11]: df2 = df2.set_index('date2') 

现在重新索引在一天的开始(与正常化,在0.15,你就可以使用.dt.normalize()):

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

如果我的低频数据不是天,有没有办法让这个工作起作用?看起来正常化不会采取任何参数,例如,如果我的低频率数据是每月或每两周一次。 – eengineer 2014-10-08 02:29:50

+0

@Envy是的。该方法是'.to_period('M')'而不是'normalize()'(也应该与'2W'一起工作,我想你也可以指定它在哪一天W-SUN等看到http://pandas.pydata .ORG /大熊猫-文档/稳定/ timeseries.html#锚定-偏移) – 2014-10-08 02:38:28

相关问题