【问题标题】:Pandas subtract dates to get a surgery patient length of stay熊猫减去日期以获得手术患者的住院时间
【发布时间】:2021-09-09 11:41:11
【问题描述】:

我有一个包含入院日期 (ADMIDATE) 和出院日期 (DISDATE) 的手术活动数据框。它是 600k 行 x 78 列,但我已针对特定手术对其进行了过滤。我想计算停留时间并将其添加为另一列。 通常我使用

df["los"] = (df["DISDATE"] - df["ADMIDATE"]).dt.days

我最近不得不清理数据,并且必须以与以前不同的方式完成它,因为我现在得到了负损失,例如。

DISDATE. . ADMIDATE. . los.
2019-12-24 2019-12-08 -43805.
2019-05-15 . 2019-03-26 50.
2019-10-11 . 2019-10-07 4.
2019-06-20 2019-06-16 4
2019-04-11 2019-04-08 3
df.info()

df.info()

    <class '`pandas`.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 78 columns):

5 ADMIDATE 5 非空 datetime64[ns] 28 DISDATE 5 非空 datetime64[ns]

RangeIndex:5 个条目,0 到 4 数据列(共78列):

5   ADMIDATE          5 non-null      datetime64[ns]
28  DISDATE           5 non-null      datetime64[ns]

我不确定如何针对问题提出正确的问题,以及为什么它只影响某些行。在清理数据时,一些 DISDATES 必须从另一列(也是日期列)填充,因为它们不完整,我想知道这些是否是由于原始数据的某些保留而导致的,即使打印新的DISDATE 看起来不错。

【问题讨论】:

  • 你能给出你得到负值的行吗?

标签: pandas date


【解决方案1】:

您的样本与正确的输出效果很好(第一行为 16 天)

你可以试试看问题是否仍然存在:

import io

data = df[['DISDATE', 'ADMIDATE']].to_csv()
test = pd.read_csv(io.StringIO(data), index_col=0,
                   parse_dates=['DISDATE', 'ADMIDATE'])

print(test['DISDATE'].sub(test['ADMIDATE']).dt.days)

输出:

0    16
1    50
2     4
3     4
4     3
dtype: int64

更新

要调试您的错误日期,请尝试:

df.loc[pd.to_datetime(df['ADMIDATE'], errors='coerce').isna(), 'ADMIDATE']

您应该会看到值不是正确日期的行。

【讨论】:

  • 这对实际数据也很有效。抱歉,我是一名外科医生,只有有限的 python/pandas 过滤技能。我可以看到使用字符串方法的逻辑。如何将其转换为可用的清洁方法,为什么我的方法失败了?
  • 我不知道。强制 Pandas 转换为 datetime64:df['DISDATE'] = pd.to_datetime(df['DISDATE'])df['ADMIDATE'] = pd.to_datetime(df['ADMIDATE'])。它也有用吗?
  • ''' df['DISDATE'] = pd.to_datetime(df['DISDATE'])''' 很好,但是 '''df['ADMIDATE'] = pd.to_datetime(df ['ADMIDATE'])''' 给出错误。 - ParserError:未知的字符串格式:ADMIDATE。 - 也许就是这样?
  • 你确定你没有输入pd.to_datetime('ADMIDATE')
  • 我必须拥有,因为我现在无法复制它。我也发现了问题。我在清理脚本中的 pd.to_datetime 之后替换了空值。现在我在一切都好之前就拥有了。非常感谢您的帮助。
猜你喜欢
  • 2018-11-15
  • 2018-11-15
  • 2020-08-27
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 2021-08-30
  • 2019-05-20
相关资源
最近更新 更多