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

如何使用Pandas替换CSV文件中的负天数及0值时间差数据

解决方案

报错原因

报错是因为diff字段为timedelta64[ns]时间差类型,无法直接与整数进行比较,需要将比较对象转为同类型的时间差,或者先提取时间差的天数整数值再做运算。

另外你原代码里有个笔误:diff = pd.firstdate - pd.lastdate错误,pd是Pandas库的引用名,需要替换为你的DataFrame变量df,即diff = df['firstdate'] - df['lastdate']。


实现方案

方案1:保留timedelta类型输出

如果需要thedif列保留时间差格式,直接用pd.Timedelta生成同类型的比较值即可:

import pandas as pd
import numpy as np

df = pd.read_csv("csv_data.csv", encoding="UTF-8",
    parse_dates = [
        "firstdate",
        "lastdate",
    ], dayfirst=True
)
diff = df['firstdate'] - df['lastdate']

# 需求1:将负天数替换为0天
df['thedif'] = np.where(diff < pd.Timedelta(days=0), pd.Timedelta(days=0), diff)

# 需求2:将负天数替换为30天,替换上面一行即可
# df['thedif'] = np.where(diff < pd.Timedelta(days=0), pd.Timedelta(days=30), diff)

也可以用Pandas原生方法简化写法:

  • 替换负天数为0:df['thedif'] = diff.clip(lower=pd.Timedelta(days=0))
  • 替换负天数为30天:df['thedif'] = diff.mask(diff < pd.Timedelta(days=0), pd.Timedelta(days=30))

方案2:输出整数天数格式

如果只需要天数的整数值,可以先提取时间差的天数属性再处理:

diff_days = (df['firstdate'] - df['lastdate']).dt.days

# 负天数替换为0
df['thedif'] = np.where(diff_days < 0, 0, diff_days)

# 负天数替换为30
# df['thedif'] = np.where(diff_days < 0, 30, diff_days)

处理后效果(以替换负天数为0为例)

index firstdate   lastdate   thedif
0     2021-03-02  2021-04-02 0days
1     2021-04-02  2021-03-02 31days
2     2021-03-03  2021-03-03 0days

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:36:04