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

Python计算入院与手术日期timedelta出现异常负值求助

解决日期差计算出现负值的问题

问题原因

核心问题是pd.to_datetime自动解析日期格式时出现歧义:
对于01/09/2021这类格式,pandas默认会优先按月/日/年解析为2021-01-09,但你的实际需求是日/月/年(即2021-09-01)。而入院日期31/08/2021因31大于12,pandas只能按日/月/年解析,导致两个日期的解析规则不一致,最终算出负数差值(2021-01-09 - 2021-08-31正好等于-234天)。

解决方案

在pd.to_datetime中明确指定日期格式,确保所有日期按统一规则解析:

修正后的代码

import pandas as pd
import numpy as np

# 针对纯日期的入院列,指定日/月/年格式
df['ADMISSION.DATE'] = pd.to_datetime(df['ADMISSION.DATE'], format='%d/%m/%Y', errors='coerce')
# 针对带时间的手术列,指定包含时间的日/月/年格式
df['1ST.SURGERY.DATE'] = pd.to_datetime(df['1ST.SURGERY.DATE'], format='%d/%m/%Y %H:%M:%S', errors='coerce')

# 计算天数差(保留小数可体现小时部分)
df['TIME_DELTA'] = (df['1ST.SURGERY.DATE'] - df['ADMISSION.DATE']) / np.timedelta64(1, 'D')

# 如果只需要整数天数,可用dt.days
# df['TIME_DELTA'] = (df['1ST.SURGERY.DATE'] - df['ADMISSION.DATE']).dt.days

df['TIME_DELTA']

备选方案(处理多格式日期)

如果你的日期列存在混合格式(部分纯日期、部分带时间),可以使用dayfirst=True让pandas优先将第一个数字视为日:

df['ADMISSION.DATE'] = pd.to_datetime(df['ADMISSION.DATE'], dayfirst=True, errors='coerce')
df['1ST.SURGERY.DATE'] = pd.to_datetime(df['1ST.SURGERY.DATE'], dayfirst=True, errors='coerce')

注意:dayfirst=True并非绝对可靠,当日期中所有数字都≤12时仍可能解析错误,因此明确指定format是最稳妥的方式。

内容的提问来源于stack exchange,提问作者Aayush Kaushal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:35:27