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

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覆盖为当前循环的单个日期计算结果。循环结束后,整列只会保留最后一次循环的计算值,所以所有行显示同一个日期。

  • 次要问题:

    1. df1.style.format(...)仅生成带样式的显示对象,不会修改原DataFrame内容,对后续计算无实际作用。
    2. 函数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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:50:24