我尝试做这里所做的事情:Pandas resampling with custom volume weighted aggregation,但是我的索引命中了一个TypeError。
我有如下数据:
Dates P Q
0 2020-09-07 01:20:24.738686 7175.0 21
1 2020-09-07 01:45:27.540590 7150.0 7
2 2020-09-07 03:48:49.120607 7125.0 4
3 2020-09-07 04:45:50.972042 7125.0 6
4 2020-09-07 05:36:23.139612 7125.0 2我使用print(df.dtypes)检查类型,它返回:
Dates datetime64[ns]
P float64
Q int64
dtype: object然后,我使用df = df.set_index(pd.DatetimeIndex(df['Dates']))将索引设置为日期
然后,我删除了Dates列,以便于使用df = df.drop(['Dates'], axis=1)读取
这给了我
P Q
Dates
2020-09-07 01:20:24.738686 7175.0 21
2020-09-07 01:45:27.540590 7150.0 7
2020-09-07 03:48:49.120607 7125.0 4
2020-09-07 04:45:50.972042 7125.0 6
2020-09-07 05:36:23.139612 7125.0 2然后,我尝试重新采样:
def vwap(data):
price = data.P
quantity = data.Q
top = sum(price * quantity)
bottom = sum(quantity)
return top / bottom
df2 = df.resample("5h",axis=1).apply(vwap)这将导致错误TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'
查看其他具有类似名称的堆栈溢出条目,它们的问题主要是datetime只看起来像一个datetime,但实际上并没有格式化为datetime。这里的情况并非如此,因为我们可以在前面看到日期列的类型为datetime64[ns]
此外,如果我使用print(df.index.dtype),我会得到:
datetime64[ns]有什么建议吗?乐于澄清任何事情或提供更多的代码,如果这是有帮助的。
发布于 2020-09-19 19:19:01
删除axis=1参数并使用pd.Grouper是可行的:
df.groupby(pd.Grouper(freq="5h")).apply(vwap)Dates
2020-09-07 00:00:00 7157.236842
2020-09-07 05:00:00 7125.000000
dtype: float64如果需要具有信息性列名的数据帧,请使用reset_index
df.groupby(pd.Grouper(freq="5h")).apply(vwap).reset_index(name="vwap") Dates vwap
0 2020-09-07 00:00:00 7157.236842
1 2020-09-07 05:00:00 7125.000000https://stackoverflow.com/questions/63967719
复制相似问题