大熊猫切割或分组日期范围

时间:2016-11-30 01:27:55

标签: python pandas

我有多个带有日期列的数据框。我希望将这些数据帧按日期列分组5天。通常这样的工作:

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,但它不适用于datetime列。 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')))

换句话说,我需要按照特定日期范围对数据帧进行分组。

1 个答案:

答案 0 :(得分:1)

基本上,您需要让所有数据帧共享同一组日期。因此,考虑在日期的不同数据框上进行外部合并以保留所有列。外部合并在左侧和右侧连接中保留值,并且将填充NaN以查找不在当前数据帧中的相应日期。然后,运行TimeGrouper

下面将所有数据帧保存到一个列表中,该列表更易于在全局环境中运行完整操作并避免多个对象:

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