You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas逐行修改DataFrame日期值遇KeyError报错求助

问题分析与修正

1. 触发KeyError的直接原因

你执行这段代码后:

df = pd.to_datetime(df['colA']).dt.weekday

原本的DataFrame被替换成了Series(仅包含一列数据,无列索引),所以后续函数里调用df['colA']会触发KeyError——因为Series不存在名为'colA'的键。

2. 代码逻辑的其他问题

  • 循环里每次固定取iloc[0]的值,没有遍历每行数据
  • df.at[i,col] + 1仅做了加法运算,但未将结果赋值回DataFrame
  • Pandas中应尽量避免逐行for循环,效率极低,优先用矢量化操作

3. 结合你的核心需求修正代码

你的目标是让新日期与原始日期的星期几保持一致(比如原始是周一,新日期是周二就往前调1天),以下是完整的实现代码:

import pandas as pd
from datetime import timedelta

# 读取Excel,保留原始日期列
df = pd.read_excel("Test.xlsx", usecols=[0], header=None, names=['原始日期'])

# 新增列:原始日期对应的星期数(0=周一,6=周日)
df['原始星期'] = pd.to_datetime(df['原始日期']).dt.weekday

# ------------------- 模拟新增新日期列(实际替换为你的真实新日期数据) -------------------
# 示例:给每个原始日期加1年作为新日期
df['新日期'] = pd.to_datetime(df['原始日期']) + pd.DateOffset(years=1)

# 新增列:新日期对应的星期数
df['新日期星期'] = pd.to_datetime(df['新日期']).dt.weekday

# 计算调整天数:让新日期星期与原始星期匹配
df['调整天数'] = (df['原始星期'] - df['新日期星期']) % 7

# 生成最终调整后的日期
df['调整后日期'] = df['新日期'] + pd.to_timedelta(df['调整天数'], unit='D')

# 查看结果
print(df[['原始日期', '新日期', '调整后日期']])

4. 针对你测试代码的最小修复

如果只是想修复原for循环的报错,同时保留基础逻辑,可以这样改:

import pandas as pd
from datetime import date, timedelta, datetime

# 读取数据,保留DataFrame结构
df = pd.read_excel("Test.xlsx", usecols=[0], header=None, names=['colA'])

# 不替换原始df,新增列存储星期数
df['星期数'] = pd.to_datetime(df['colA']).dt.weekday

print(df)

def new_Date(df, col):
    for i in df.index:
        # 取当前行的星期数,而非固定取第0行
        A_val = df.loc[i, col]
        if A_val == 0:
            # 将计算结果赋值回去,这里是示例逻辑,可替换为你的调整规则
            df.loc[i, col] = A_val + 1

# 传入新增的'星期数'列
new_Date(df, '星期数')
print(df)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:25:19