【问题标题】:How can I remove "days" when computing the difference between two dates?在计算两个日期之间的差异时如何删除“天”?
【发布时间】:2018-03-12 11:47:36
【问题描述】:

当使用以下方法计算两个日期之间的差异时:

df_test['Difference'] = (df_test['First_Date'] - df_test['Second Date'])

我得到第三列“x 天”。

如何将 "x Days" 转换为 int "x"。例如,“50 天”变成“50”?

上一个帖子中有人建议使用:

df_test['Difference'] = (df_test['First_Date'] - df_test['Second Date']).dt.days

但是使用它我得到一个类型的错误:

"'Series'对象没有属性'dt"

请问我该如何解决这个问题?

【问题讨论】:

  • 您是否将列转换为日期时间?
  • 请添加您的 df 的数据样本。日期没有“x 天”——这是从某个地方输出的字符串。阅读How to create a Minimal, Complete, and Verifiable example
  • 如果我减去两个日期/日期时间列,series.dt.days 对我来说效果很好
  • df_test['Difference'] = (df_test['First_Date'] - df_test['Second Date']).dt.days 在 python 3.6、pandas 0.22 上为我工作。您能否编辑您的帖子并向我们展示除df_test、列的dtypes 以及您使用的pandas 的哪个版本?
  • 我使用的是 pandas 版本 '0.14.1' 和 python 版本 2.7。抱歉,“向我们展示除 df_test 之外的列的 dtypes”是什么意思?

标签: python python-3.x python-2.7 pandas


【解决方案1】:

如果是字符串变量。然后您可以执行以下操作并去除不需要的部分。 (假设你的变量是 xDays)

df["xDays"] = df["xDays"].map(lambda x: x[:-5])

如果是 timedelta 值,您可以执行以下操作

df["xDays"].dt.days

【讨论】:

  • 2 个字符串中的 sub(...) 是什么?考虑到问题中的代码df_test['First_Date'].sub(df_test['Second Date'], axis=0),你认为它怎么可能是字符串?
【解决方案2】:

如果我坚持你的代码但用虚构的数据填写,这个修改对我有用。基本上你将 df_test['Difference'].dt.days 重新分配给 df_test['Difference'] :

df_test=pd.DataFrame(dict(zip(['First_Date', 'Second_date'], [pd.date_range("2018-01-01",periods=10), pd.date_range("2017-01-01",periods=10)])))
df_test['Difference'] = df_test['First_Date'].sub(df_test['Second_date'], axis=0)
df_test['Difference']=df_test['Difference'].dt.days

【讨论】:

  • 此代码适用于 python 3.X 和 python 2.7 with pandas 0.20.3
【解决方案3】:

功能

def duration(diff):
    tsec = diff.total_seconds()
    hh = int(tsec//3600)
    mm = int((tsec%3600)//60)
    ss = int((tsec%3600)%60)
    return('{:02d}:{:02d}:{:02d}'.format(hh,mm,ss))

测试结果:

import datetime as dt

d1 = dt.datetime(2020, 10, 21, 10, 15, 12) - dt.datetime(2020, 10, 20,  8, 5, 12)
d2 = dt.datetime(2020, 10, 21, 10, 15, 12) - dt.datetime(2020, 10, 21,  8, 0,  0)
d3 = dt.datetime(2020, 10, 21, 10, 15, 12) - dt.datetime(2020, 10, 22, 10, 5,  0)
print(duration(d1))   #    26:10:00
print(duration(d2))   #    02:15:12
print(duration(d3))   #   -24:10:12

输出

 26:10:00
 02:15:12
-24:10:12

【讨论】:

    猜你喜欢
    • 2010-12-09
    • 1970-01-01
    • 2021-11-25
    • 2011-08-01
    • 2023-01-31
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多