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
相关产品推荐
相关产品推荐

