2014-10-02 49 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

相關問題