将不完整的 12h 类日期时间字符串转换为适当的日期时间类型

Convert incomplete 12h datetime-like strings into appropriate datetime type

我有一个 pandas 系列,其中包含 12h 格式的类似日期时间的字符串,但没有 am/pm 缩写。它涵盖了整整一个月的数据:

40    01/01/2017 11:51:00
41    01/01/2017 11:51:05
42    01/01/2017 11:55:05
43    01/01/2017 11:55:10
44    01/01/2017 11:59:30
45    01/01/2017 11:59:35
46    02/01/2017 12:00:05
47    02/01/2017 12:00:10
48    02/01/2017 12:13:20
49    02/01/2017 12:13:25
50    02/01/2017 12:24:50
51    02/01/2017 12:24:55
52    02/01/2017 12:33:30
Name: TS, dtype: object
(318621,) # shape

我的目标是将其转换为日期时间格式,以获得适当的 unix 时间戳值,并使 comparisions/arithmetics 与其他日期时间数据一起使用,这次是 24 小时格式。所以我已经试过了:

pd.to_datetime(df.TS, format = '%d/%m/%Y %I:%M:%S') # %I for 12h format

输出我:

64     2017-01-02 00:46:50
65     2017-01-02 00:46:55
66     2017-01-02 01:01:00
67     2017-01-02 01:01:05
68     2017-01-02 01:05:00

但是 am/pm 信息没有被考虑在内。我知道,通常,首先必须在字符串中指定 am/pm,然后可以使用 dt.dt.strptime() pd.to_datetime() 用 %p 指标解析它们。

所以我想知道是否有其他方法可以通过 datetimepandas 日期时间 模块 ?或者,我必须在解析之前手动添加缩写 'am/pm' 吗?

您在多天中以 5 秒为间隔有数据。所需的最终格式如下(我们需要添加 AM/PM 列,因为 Pandas 不可能猜测,因为它一次只查看一个值):

31/12/2016 11:59:55 PM
01/01/2017 12:00:00 AM
01/01/2017 12:00:05 AM
01/01/2017 11:59:55 AM
01/01/2017 12:00:00 PM
01/01/2017 12:59:55 PM
01/01/2017 01:00:00 PM
01/01/2017 01:00:05 PM
01/01/2017 11:59:55 PM
02/01/2017 12:00:00 AM

首先,我们可以在没有 AM/PM 信息的情况下解析整个内容,正如您已经展示的那样:

ts = pd.to_datetime(df.TS, format = '%d/%m/%Y %I:%M:%S')

我们有一个小问题:12:00:00 被解析为中午,而不是午夜。让我们标准化:

ts[ts.dt.hour == 12] -= pd.Timedelta(12, 'h')

现在我们有时间从 00:00:00 到 11:59:55,每天两次。

接下来,请注意转换始终在 00:00:00。我们可以很容易地检测到这些,以及每个日期的第一个实例:

twelve = ts.dt.time == datetime.time(0,0,0)
newdate = ts.dt.date.diff() > pd.Timedelta(0)
midnight = twelve & newdate
noon = twelve & ~newdate

接下来,建立一个偏移量系列,它应该很容易检查正确性:

offset = pd.Series(np.nan, ts.index, dtype='timedelta64[ns]')
offset[midnight] = pd.Timedelta(0)
offset[noon] = pd.Timedelta(12, 'h')
offset.fillna(method='ffill', inplace=True)

最后:

ts += offset