Python按条件替换CSV日期列值失效,求问题排查与解决
问题:按条件修改CSV日期值未生效
原始CSV内容
Date 0 2022-11-05 1 2022-11-06 2 2022-11-08 3 2022-11-09
需求
若日期为周六则加2天,周日则加1天,替换原CSV中的值。
错误代码
df = pd.read_csv('Book1.csv') date = df["Date"] for d in date: date_object = datetime.strptime(d, '%Y-%m-%d').date() #print(date_object) weekdayidx=date_object.isoweekday() #print(weekdayidx) if weekdayidx == 6: date_final = date_object.replace(day=date_object.day + 2) elif weekdayidx == 7: date_final = date_object.replace(day=date_object.day + 1) else: date_final = date_object print(date_final) df['Date'] = df['Date'].replace({'d': 'date_final'}) df.to_csv("Book1.csv", index=False) print(df)
问题原因
- 循环内仅打印了计算后的日期,未将修改值存入DataFrame,所有计算没有作用到原数据上。
- 最后一行的
replace({'d': 'date_final'})完全无效:这里的'd'和'date_final'是固定字符串,不是循环里的变量,无法匹配任何日期值,自然不会修改数据。 - 用Python原生
datetime循环处理pandas列,效率低且容易出现变量作用域问题。
正确解决方案
利用pandas的矢量化日期操作处理,简洁高效:
import pandas as pd # 读取CSV并将Date列转为日期类型 df = pd.read_csv('Book1.csv') df['Date'] = pd.to_datetime(df['Date']) # 定义偏移规则:周六(对应isoweekday=6)加2天,周日(7)加1天,其余加0天 offset_map = {6: 2, 7: 1} offset_days = df['Date'].dt.isoweekday().map(offset_map).fillna(0).astype(int) # 应用日期偏移,转回原字符串格式 df['Date'] = (df['Date'] + pd.to_timedelta(offset_days, unit='d')).dt.strftime('%Y-%m-%d') # 保存修改后的CSV df.to_csv("Book1.csv", index=False) print(df)
验证结果
执行后CSV内容会更新为:
Date 2022-11-07 2022-11-07 2022-11-08 2022-11-09
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

