2016-11-30 146 views
1

我有多個數據幀與日期列。我想在日期列中將這些數據框分組5天。通常情況下是這樣的工作:熊貓削減或groupby日期範圍

df = pd.DataFrame([['2016-11-01 09:21:07', 10], ['2016-09-14 02:46:01', 21], ['2016-08-11 03:26:33', 14], ['2016-10-17 14:20:44', 14]], 
       columns=['DateCol', 'Values']) 
df['DateCol'] = pd.to_datetime(df['DateCol']) 

df.set_index('DateCol').groupby(pd.TimeGrouper('5D')).mean() 

然而,當我使用pd.TimeGrouper它創建一個基於我把它應用到數據幀組。如果我在兩個不同的數據框上執行此操作,則會生成不同的組。 我想通過相同的組對多個數據幀進行分組。

我嘗試過使用pd.cut,但它不適用於日期時間列。 pd.cut(df['DateCol'], 10)給我TypeError

理想我想要做這樣的事情:

pd.groupby(df, pd.cut(df['DateCol'], pd.date_range(start='1/1/2016', end='1/1/2017', freq='5D'))) 

換句話說,我需要在特定日期範圍內的GroupBy我數據幀。

回答

1

基本上,您需要讓所有數據框共享同一組日期。因此,考慮在日期的不同數據框上進行外部合併以保留所有列。外部合併在左右連接中保留值,並且將填充NaN以獲得當前不在當前數據幀中的相應日期。然後,運行TimeGrouper

以下保存所有dataframes一個列表,它是更容易地運行在全面運作,避免在全球環境中的多個對象:

from datetime import datetime as dt 
import pandas as pd 

df1 = pd.DataFrame({'DateCol': [dt.strptime(i, '%Y-%m-%d %H:%M:%S') for i in 
           ['2016-11-01 09:21:07', '2016-09-14 02:46:01', 
           '2016-08-11 03:26:33', '2016-10-17 14:20:44']], 
        'Values': [10, 21, 14, 14]}) 

df2 = pd.DataFrame({'DateCol': [dt.strptime(i, '%Y-%m-%d %H:%M:%S') for i in 
           ['2016-07-28 13:56:19', '2016-03-07 06:23:48', 
           '2016-09-26 05:31:10', '2016-08-03 12:02:59']], 
        'Values': [7, 19, 28, 36]})  
dfs = [df1, df2] 
alldates = pd.concat([i[['DateCol']] for i in dfs]).drop_duplicates() 

for i in range(len(dfs)): 
    dfs[i] = dfs[i].merge(alldates, on='DateCol', how='outer')  
    dfs[i] = dfs[i].set_index('DateCol').groupby(pd.TimeGrouper('5D')).mean() 
    print(dfs[i].head()) 

#      Values 
# DateCol      
# 2016-03-07 06:23:48  NaN 
# 2016-03-12 06:23:48  NaN 
# 2016-03-17 06:23:48  NaN 
# 2016-03-22 06:23:48  NaN 
# 2016-03-27 06:23:48  NaN 
#      Values 
# DateCol      
# 2016-03-07 06:23:48 19.0 
# 2016-03-12 06:23:48  NaN 
# 2016-03-17 06:23:48  NaN 
# 2016-03-22 06:23:48  NaN 
# 2016-03-27 06:23:48  NaN