1. 报错提示
Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'
2. 背景
需要以date作为分组依据,求均值。
grouper = pd.Grouper(freq=’D‘)) # 根据freq的值建立分组列表,D表示天
data.reset_index().set_index('date').groupby(grouper).mean() # data是一个dataframe的数据
data数据表example如下:
asset | factor | |
---|---|---|
date | ||
2015-01-15 | A | 0.25 |
2015-01-15 | B | 0.58 |
2015-01-16 | A | 0.89 |
2015-01-16 | B | 0.36 |
在pandas中,作为index的列会下沉显示,不再归为column
当data数据表由函数计算得出时,放入函数中不会报错,可以运行。
当把data数据表以csv的形式储存,再读取并重新设置date为index,放入函数中,报错。
data = data.set_index('date')
3. 原因
根据提示,报错原因时进行运算的dataframe要求时datetime index形式,而传入的只是index
这是因为数据表存入csv后,失去了数据列表的详细信息,比如全部都变成了column,没有了index的信息,需要重新设置。且列数据的数据类型也丢失了,所以经过set_index后,只是index,而不是datetime index
4. 解决方案
在set_index之前或者之后,把date列转为datetime的形式。
# 先转为datetime
data = data.set_index('date')
data.index = pd.to_datetime(data.index)
# 先设置index
data['date'] = pd.to_datetime(data['date'])
data = data.set_index('date')
5. 碎碎念
啊!终于找到了!😤