将不完整的 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 指标解析它们。
所以我想知道是否有其他方法可以通过 datetime 或 pandas 日期时间 模块 ?或者,我必须在解析之前手动添加缩写 '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
我有一个 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 指标解析它们。
所以我想知道是否有其他方法可以通过 datetime 或 pandas 日期时间 模块 ?或者,我必须在解析之前手动添加缩写 '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