You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Pandas报错:Timestamp对象不可下标访问,DataFrame日期修改求助

解决Pandas 'Timestamp' object is not subscriptable报错

嘿,这个问题我碰到过,咱们来拆解一下问题根源,再给你修正方案!

错误原因

你代码里的lambda x: x['date'].replace(...)是核心问题:你的df['date']列存储的是Pandas Timestamp对象,而不是字典或者嵌套的Series。Timestamp没有下标访问([])的方法,所以x['date']会直接抛出"not subscriptable"的错误——你直接操作x本身就行,它就是你要处理的时间戳!

另外还要注意:你用df.loc[:last_consumption_of_year_index]['date']这种链式索引的写法,很可能会触发SettingWithCopyWarning,因为这种写法可能返回的是原DataFrame的副本而非视图,赋值操作可能不会生效到原DataFrame上。

修正后的代码

我把你的代码调整了两处:一是修复Timestamp的操作,二是用正确的.loc多轴索引避免链式赋值问题,同时还给你提供了更高效的向量化替代方案:

方案1:修正apply写法

import pandas as pd
from datetime import datetime

# 假设current_year是你需要的年份,比如当前年份
current_year = datetime.now().year

# 先定位目标索引(增加空值判断,避免找不到匹配行时报错)
mask = (df['date'].dt.month == 12) & \
       (df['date'].dt.day == 31) & \
       (df['date'].dt.hour == 23) & \
       (df['date'].dt.minute == 30)

if not mask.any():
    raise ValueError("没有找到符合年末23:30条件的时间戳,请检查数据!")

last_consumption_of_year_index = df.loc[mask].index[0]

# 修正第一个赋值操作:直接操作Timestamp对象,用.loc直接定位列
df.loc[:last_consumption_of_year_index, 'date'] = df.loc[:last_consumption_of_year_index, 'date'].apply(
    lambda x: x.replace(year=current_year - 1)
)

# 完成第二个赋值操作(假设你要将后续行的年份改为current_year)
df.loc[last_consumption_of_year_index + 1:, 'date'] = df.loc[last_consumption_of_year_index + 1:, 'date'].apply(
    lambda x: x.replace(year=current_year)
)

方案2:更高效的向量化操作(推荐)

Pandas的dt属性支持向量化的replace操作,比逐元素的apply效率高得多,尤其是处理大数据集时:

# 延续上面的mask和索引定位逻辑
df.loc[:last_consumption_of_year_index, 'date'] = df.loc[:last_consumption_of_year_index, 'date'].dt.replace(year=current_year - 1)
df.loc[last_consumption_of_year_index + 1:, 'date'] = df.loc[last_consumption_of_year_index + 1:, 'date'].dt.replace(year=current_year)

额外提醒

  • 确保你的current_year变量已经被正确定义,比如你可以根据业务需求设置为固定年份,或者用datetime.now().year获取当前年份。
  • 如果你的数据中可能存在多个符合年末条件的行,index[0]只会取第一个匹配的索引,如果你需要处理所有匹配行,可能需要调整逻辑。

内容的提问来源于stack exchange,提问作者Darkstarone

火山引擎 最新活动