将 unusual/custom 时间格式转换为日期时间对象

Convert an unusual/custom time format to datetime object

我的数据集中有一个不寻常的日期时间格式,我需要将其转换为可用的日期时间对象。

示例如下:'1/3/2018 1:29:35 PM(UTC+0)'

我尝试用以下方法解析它:

from dateutil.parser import parse
parse('1/3/2018 1:29:35 PM(UTC+0)')

但它无法识别格式。

我目前的解决方法是使用正则表达式将日期时间列(数据在 pandas 数据帧中)解析为两列,如下所示:

然后根据 'utc' 列的值应用自定义 convert_to_eastern 函数。

我想知道是否有更简单的方法使用 datetime.datetime.strptime() 来完成它?

以下无效:

import datetime as dt

my_time='1/3/2018 1:29:35 PM(UTC+0)'
dt.datetime.strptime(my_time, '%m/%d/%Y %I:%M:%S %p(%z)')

补充: 这不是一个问题:"How to convert UTC timezone into local timezone" 我的数据集包含带有 UTC 的行以及东部时区的行。我遇到的问题是该格式不是 ISO 格式,而是一些人类可读的自定义格式。

应该是这样的:

import datetime as dt

my_time='1/3/2018 1:29:35 PM(UTC+0000)'
tmp = dt.datetime.strptime(my_time, '%m/%d/%Y %I:%M:%S %p(%Z%z)')
print(tmp)

大 "Z" 时区(UTC、GMT 等),小 "z" 时区。您还应该向增量添加更多零。

问题出在您的时区 'UTC+0' 的“+0”上。 datetime 仅采用 HHMM 形式的 utc 偏移量。可能的解决方法:

import datetime as dt

my_time = '1/3/2018 1:29:35 PM(UTC+0)'
my_time=my_time.replace('+0','+0000')
dt.datetime.strptime(my_time, '%m/%d/%Y %I:%M:%S %p(%Z%z)')

Question: an easier way to accomplish it using datetime.datetime.strptime()

将日期字符串分成几部分:utc:[('1/3/2018 1:29:35 PM', '(UTC+0)', 'UTC', '+', '0')]
重建日期字符串,将 0hour 部分填充固定为 2 位数字。
我假设 UTC 部分没有 minutes,因此默认为 00.

如果日期字符串超过 2 UTC 位,returns 未更改的日期字符串。

Note: The strptime format have to be %Z%z!
Documentation: strftime-and-strptime-behavior

from datetime import datetime
import re

def fix_UTC(s):
    utc = re.findall(r'(.+?)(\((\w{3})(\+|\-)(\d{1,2})\))', s)
    if utc:
        utc = utc[0]
        return '{}({}{}{})'.format(utc[0], utc[2], utc[3], '{:02}00'.format(int(utc[4])))
    else:
        return s

my_time = fix_UTC('1/3/2018 1:29:35 PM(UTC+0)')
date = datetime.strptime(my_time, '%m/%d/%Y %I:%M:%S %p(%Z%z)')
print("{} {}".format(date, date.tzinfo))

Output:

2018-01-03 13:29:35+01:00 UTC

使用 Python 测试:3.4.2