Pandas|Index不是datatime index报错

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如下:

assetfactor
date
2015-01-15A0.25
2015-01-15B0.58
2015-01-16A0.89
2015-01-16B0.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. 碎碎念

啊!终于找到了!😤

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
r1 = rand(); r2 = rand(); A = 2 * alpha * r1 - alpha; C =在 Pandas 中,出现 "unhashable type: 'MultiIndex'" 的错误通常是由于使用 MultiIndex 对象 2 * r2; distance_to_best = abs(pareto_front(1, :) - solution(i, :)); D = distance_to_best * beta; new_position = pareto_front(1, :) - A .* D; new_position = check_position作为 DataFrame 的索引或列名时,进行了哈希操作导致的。由于 MultiIndex 对象是不可(new_position, energy_demand); new_velocity = w * solution(i, :) + C .* distance_to_best; new_velocity = check哈希,因此会报错。 要解决这个问题,可以考虑使用其他类型的索引,如单级索引或者元组(tuple)作为列名或索引名。 下面是一些解决方法: 1. 使用单级索引代替 MultiIndex 如果不需要使用 MultiIndex 的特性,可以考虑使用单级索引代替 MultiIndex。可以使用 `reset_index()` 方法将 MultiIndex 转换为单级索引,然后再重新设置索引: ```python df = df.reset_index() df.columns = ['col1', 'col2', 'col3'] df = df.set_index(['col1', 'col2']) ``` 2. 使用元组作为列名或索引名 如果需要使用多级索引,可以考虑使用元组作为列名或索引名,而不是 MultiIndex 对象: ```python df.columns = [('col1', 'sub_col1'), ('col1', 'sub_col2'), ('col2', 'sub_col3')] df.index = [('row1', 'sub_row1'), ('row1', 'sub_row2'), ('row2', 'sub_row3')] ``` 3. 禁止对 MultiIndex 进行哈希操作 如果确实需要使用 MultiIndex 对象作为列名或索引名,可以在操作时禁止对 MultiIndex 进行哈希操作。可以使用 `pd.IndexSlice` 对象来进行切片操作: ```python idx = pd.IndexSlice df.loc[idx[:, 'value'], idx[:, 'column']] = 1 ``` 以上是一些常见的解决方法,根据具体的情况选择合适的方法即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值