【问题标题】:How do I parse dates with more than 24 hours in dateutil's parser in Python 3?如何在 Python 3 的 dateutil 解析器中解析超过 24 小时的日期?
【发布时间】:2014-06-26 14:01:09
【问题描述】:

我目前在一个类似“27:32:18”的专栏中有很多次,这意味着有人在等待 27 小时 32 分 18 秒。每当我尝试解析这些值时,我都会不断收到“ValueError:小时必须在 0..23”。

我应该如何解析这些值或将它们转换为更标准的格式?我尝试了以下作为对单个值的测试:

time1 = "56:42:12"
time2 = time1.split(':')
time2 = [int(n) for n in time2]
time2.insert(0, time2[0] // 24)
time2[1] %= 24

此时time2是一个由[2, 8, 42, 12]组成的列表,相当于2天8小时42分12秒。我将如何以允许 Python 解析它的方式将其转换为以天、小时、分钟和秒为单位的 Python 日期时间表示?请注意,我最终将对这些时间值(代表等待时间)进行无监督聚类。

【问题讨论】:

  • 那是不是日期持续时间是完全不同的野兽。
  • 一个python datetime对象只能用来表示一个特定的时间点;例如1889 年 7 月 31 日。持续时间以 timedelta() 对象表示。
  • 一个区间需要有一个引用,它是一个增量。只说“2 天 8 小时 42 分钟”而不指定 since 部分,会使 date 部分变得困难。如果您只想计算持续时间,这(就像 Martijn 所说)是另一回事。
  • 谢谢!所以使用时间增量而不是日期时间。

标签: python parsing datetime python-3.x


【解决方案1】:

你没有一个日期,你有一个持续时间。这可能与日期和时间戳有关,但只是涉及相同的时间单位,并且显示方式与时间戳相似。

因此,您不能使用dateutil 来解析此类值。拆分和解析自己很容易:

hours, minutes, seconds = map(int, time1.split(':'))

然后您可以使用datetime.timedelta() 对象来表示持续时间:

td = datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds)

然后,这将以天、秒和微秒为单位跟踪增量:

>>> import datetime
>>> time1 = "56:42:12"
>>> hours, minutes, seconds = map(int, time1.split(':'))
>>> datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds)
datetime.timedelta(2, 31332)

【讨论】:

  • 谢谢!尽管无论出于何种原因,它都不允许我实际更改存储的值。我有以下 for 循环。请注意它是 Pandas 代码:对于 df.elapsed_time 中的时间:小时、分钟、秒 = map(int, time.split(':')) time = timedelta(hours=hours, minutes=minutes, seconds=seconds)
  • 为什么需要更改存储的值?你想改变什么价值观?
  • 我需要更改存储的值,以便对急诊室患者的等待时间进行数据分析。还有其他相关的患者信息,因此我需要将更新的值放在我正在使用的大型数据框中。我正在尝试将像“54:23:45”这样存储的值转换为像 (2, 31332) 这样的时间增量,这样我最终可以在 scikit-learn 中进行一些聚类。
  • 嗨@BrandonSherman,您可以使用df['elapsed_time_new'] = pd.to_timedelta(df.elapsed_time) 在您的DataFrame 中创建一个新列,其中将包含timedelta 对象,您可以根据分析需要对其进行操作。 to_timedelta 的文档可以在 here 找到。请注意,这些对象被分解为天、小时、分钟、秒,因此您可能需要进一步的工作才能将其分解为您似乎想要的(天、秒)。
  • 这真的很不幸 :( 你可以做的是编写一个函数(我们称之为convert 以保持简短),它接受你的一个字符串,然后转换它并返回一个@987654332 @对象然后你可以做df['elapsed_time_new'] = df['elapsed_time'].apply(convert),它会将你的convert函数应用于你列中的每个字符串并将它放在你的新列中。您可能可以使用Martijn在上面的回答中给出的方法来编写这样一个功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多