我有多个带有日期列的数据框。我希望将这些数据帧按日期列分组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')))
换句话说,我需要按照特定日期范围对数据帧进行分组。
答案 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