Pandas从日期列减60天生成新列时结果重复问题排查
批量计算日期偏移时结果全部重复的问题解决
我尝试通过从「Harvest_date」列减去60天创建新列「Starting_date」,但得到的结果全是相同日期。
原始Harvest_date数据:
| Harvest_date |
|---|
| 20.12.21 |
| 12.01.21 |
| 10.03.21 |
使用的代码:
import pandas as pd from datetime import timedelta df1 = pd.read_csv (r'C:\Flower_weight.csv') def subtract_days_from_date(date, days): subtracted_date = pd.to_datetime(date) - timedelta(days=days) subtracted_date = subtracted_date.strftime("%Y-%m-%d") return subtracted_date df1['Harvest_date'] = pd.to_datetime(df1.Harvest_date) df1.style.format({"Harvest_date": lambda t: t.strftime("%Y-%m-%d")}) for harvest_date in df1['Harvest_date']: df1["Starting_date"]=subtract_days_from_date(harvest_date,60) print(df1["Starting_date"])
得到的错误结果:
| Starting_date |
|---|
| 2021-10-05 |
| 2021-10-05 |
| 2021-10-05 |
错误原因分析
核心错误:循环赋值逻辑错误
你在for循环中执行df1["Starting_date"]=subtract_days_from_date(harvest_date,60)时,每次都是将整列Starting_date覆盖为当前循环的单个日期计算结果。循环结束后,整列只会保留最后一次循环的计算值,所以所有行显示同一个日期。次要问题:
df1.style.format(...)仅生成带样式的显示对象,不会修改原DataFrame内容,对后续计算无实际作用。- 函数
subtract_days_from_date中重复调用pd.to_datetime(date),但你已经提前将Harvest_date列转为datetime类型,属于冗余操作。
解决方法
方法1:Pandas矢量化操作(推荐)
Pandas支持直接对整列进行日期运算,无需循环,代码简洁且效率更高:
import pandas as pd from datetime import timedelta df1 = pd.read_csv(r'C:\Flower_weight.csv') # 指定日期格式,避免自动识别出错 df1['Harvest_date'] = pd.to_datetime(df1.Harvest_date, format="%d.%m.%y") # 直接对整列做减法,再格式化输出 df1['Starting_date'] = (df1['Harvest_date'] - timedelta(days=60)).dt.strftime("%Y-%m-%d") print(df1[['Harvest_date', 'Starting_date']])
方法2:修改循环逻辑(不推荐,效率低)
如果一定要使用循环,需对每行单独赋值,而非整列覆盖:
import pandas as pd from datetime import timedelta df1 = pd.read_csv(r'C:\Flower_weight.csv') df1['Harvest_date'] = pd.to_datetime(df1.Harvest_date, format="%d.%m.%y") # 先初始化空列 df1['Starting_date'] = "" for idx, harvest_date in enumerate(df1['Harvest_date']): subtracted_date = harvest_date - timedelta(days=60) df1.loc[idx, "Starting_date"] = subtracted_date.strftime("%Y-%m-%d") print(df1["Starting_date"])
内容的提问来源于stack exchange,提问作者Stetco Oana
相关产品推荐
相关产品推荐

