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
相关产品推荐
相关产品推荐

