使用Pandas计算手术患者住院时长时出现负值的问题求助
排查与解决住院时长计算出现负值的问题
看起来你遇到了日期数据清洗后计算住院时长(los)出现负值的问题,这在医疗数据处理里挺常见的,尤其是当你从其他列填充缺失出院日期(DISDATE)的时候。下面是一步步的排查和解决思路,帮你定位并修复这个问题:
一、先精准定位异常数据
首先得把所有los为负的行揪出来,看看它们的特征,以及是不是那些被填充过DISDATE的行:
- 筛选出所有los为负的行,查看日期细节:
negative_los = df[df["los"] < 0] print(negative_los[["ADMIDATE", "DISDATE", "los"]]) - 如果你在填充DISDATE的时候没标记哪些行是被填充的,建议先回溯填充逻辑——比如你是从哪一列填充的,把那列和当前的DISDATE、ADMIDATE放在一起对比,看看有没有明显的日期逻辑错误。要是有原始数据备份,也可以对比原始DISDATE和现在的差异。
二、深挖日期数据的底层问题
虽然df.info()显示ADMIDATE和DISDATE都是datetime64[ns]类型,但有时候表面类型正确,实际存储的日期可能藏着逻辑错误:
- 你示例里的-43805天很可疑,计算一下就会发现,这个差值对应的是出院日期远早于入院日期的情况——大概率是其中一个日期的年份被错误解析了(比如把2019当成了1919)。可以查看日期的底层时间戳来验证:
正常2019年的日期时间戳应该在# 把日期转换成底层存储的纳秒时间戳 negative_los["ADMIDATE_ts"] = negative_los["ADMIDATE"].view('int64') negative_los["DISDATE_ts"] = negative_los["DISDATE"].view('int64') print(negative_los[["ADMIDATE", "DISDATE", "ADMIDATE_ts", "DISDATE_ts"]])1.5e18左右,如果某个日期的时间戳远小于这个值,说明年份肯定错了。 - 检查填充来源列的日期解析:你是从另一列填充DISDATE的,要确认那列在转换成datetime类型时有没有出错——比如字符串日期格式不统一(比如
2019/12/24和24-12-2019混在一起),导致pandas解析时把年份搞反了。
三、针对性修复异常数据
根据排查出的原因,对应修复:
- 如果是填充来源列的日期解析错误:重新处理来源列,确保转换成正确的datetime类型后再填充:
# 先把来源列转换成datetime,错误的日期设为NaN df["source_date"] = pd.to_datetime(df["source_date"], errors='coerce') # 只填充原本缺失的DISDATE行 df["DISDATE"] = df["DISDATE"].fillna(df["source_date"]) - 如果是年份异常(比如把19当成1919):可以通过条件判断修正年份,比如给年份小于2000的日期加100年:
df["ADMIDATE"] = df["ADMIDATE"].apply(lambda x: x + pd.DateOffset(years=100) if x.year < 2000 else x) df["DISDATE"] = df["DISDATE"].apply(lambda x: x + pd.DateOffset(years=100) if x.year < 2000 else x) - 最后重新计算los,同时把异常的负值标记为缺失,方便后续单独处理:
df["los"] = (df["DISDATE"] - df["ADMIDATE"]).dt.days # 把负值los替换为缺失值,避免影响后续分析 df["los"] = df["los"].where(df["los"] >= 0, pd.NA)
四、预防后续再出现类似问题
- 日期清洗后加校验步骤:每次处理完日期列,都检查一下入院日期是否早于出院日期:
df["is_date_valid"] = df["ADMIDATE"] < df["DISDATE"] print(f"发现{len(df[~df['is_date_valid']])}行日期逻辑异常") - 填充日期时保留标记:新增一列记录哪些行的DISDATE是被填充的,方便后续排查问题:
df["DISDATE_was_filled"] = df["DISDATE"].isna() df["DISDATE"] = df["DISDATE"].fillna(df["source_date"])
内容的提问来源于stack exchange,提问作者capnahab
相关产品推荐
相关产品推荐

