如何在Python 3中的dateutil解析器中解析超过24小时的日期?

Bra*_*man 2 python datetime parsing python-3.x

我目前在一个类似"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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 10

你不会一个日期,你有一个持续时间.这可能与日期和时间戳有关,但仅涉及相同的时间单位,并且与时间戳类似地显示.

因此,您不能dateutil用于解析此类值.分解和解析自己很容易:

hours, minutes, seconds = map(int, time1.split(':'))
Run Code Online (Sandbox Code Playgroud)

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

td = datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds)
Run Code Online (Sandbox Code Playgroud)

然后,这将以天,秒和微秒的形式跟踪增量:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

  • 这真的很不幸:(你可以做什么而不是写一个函数(让我们称它为`convert`以保持简短),它接受你的一个字符串,然后转换它并返回一个`timedelta`对象然后你可以做``df ['elapsed_time_new'] = df ['elapsed_time'].apply(convert)`它会将你的`convert`函数应用到你的列中的每个字符串并将它放在你的新列中.你可以使用Martijn的方法在上面的回答中给出了写这样一个函数. (3认同)
  • 您好@BrandonSherman你可以使用`df ['elapsed_time_new'] = pd.to_timedelta(df.elapsed_time)`在你的`DataFrame`中创建一个新列,它将包含你可以根据分析需要操作的`timedelta`对象.可以在[这里]找到"to_timedelta"的文档(http://pandas.pydata.org/pandas-docs/dev/generated/pandas.to_timedelta.html).请注意,这些对象分为几天,几小时,几分钟,几秒钟,因此您可能需要进一步的工作将其分解为(天,秒),这是您想要的. (2认同)