我有以下数据集
df = pd.DataFrame({'timestamp': pd.date_range('1/1/2020', '3/1/2020 23:59', freq='12h'),
'col1': np.random.randint(100,size=122)}).\
sort_values('timestamp')
我想计算col1
的每日,每周和每月总和。如果我在timestamp
列中使用'W'粒度,则会收到ValueError:ValueError: <Week: weekday=6> is a non-fixed frequency
,我读到建议使用7D
,30D
等。
我的问题是大熊猫如何计算7D
或30D
的粒度?如果我添加另一列
df['timestamp2']= df.timestamp.dt.floor('30D')
df.groupby('timestamp2')[['col1']].sum()
我得到以下结果:
timestamp2 col1
2019-12-10 778
2020-01-09 3100
2020-02-08 2470
如果我的最小日期是2020年1月1日且最大时间戳是2020年3月1日,为什么熊猫会返回这些日期?
答案 0 :(得分:1)
origin
是POSIX的起源: 1970-01-01 。通过使用.floor('30D')
,允许值为1970-01-01、1970-01-31,...和所有其他30天倍数。您的日期接近第608-610倍。
pd.to_datetime('1970-01-01') + pd.DateOffset(days=30*608)
#Timestamp('2019-12-10 00:00:00')
pd.to_datetime('1970-01-01') + pd.DateOffset(days=30*609)
#Timestamp('2020-01-09 00:00:00')
如果您想要的是距初次观察30天的时间,那么resample
是汇总方式:
df.resample('30D', on='timestamp')['timestamp'].agg(['min', 'max'])
min max
timestamp
2020-01-01 2020-01-01 2020-01-30 12:00:00 # starts from 1st date
2020-01-31 2020-01-31 2020-02-29 12:00:00
2020-03-01 2020-03-01 2020-03-01 12:00:00