如何使用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
相关产品推荐
相关产品推荐

