将异常/自定义时间格式转换为datetime obj

2024-04-16 08:21:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据集中有一个不寻常的datetime格式,我需要将其转换为可用的datetime对象。你知道吗

例如:“2018年1月3日下午1:29:35(UTC+0)”

我试着用以下方法来解析它:

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

但它无法识别格式。你知道吗

我目前的解决方法是使用regex将datetime列(数据在dataframe中)解析为两列,如下所示:

dataframe

然后根据“utc”列的值应用自定义convert\u to\u函数。你知道吗

我想知道是否有一种更简单的方法可以通过datetime.datetime.strtime() ?

以下操作无效:

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)')

附加: 这不是一个问题:“如何将UTC时区转换为本地时区”我的数据集有UTC和东部时区的行。我遇到的问题是,该格式不是ISO格式,而是一些人类可读的自定义格式。你知道吗


Tags: 数据对象方法fromimportparserdatetimetime
3条回答

应该是这样的:

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”表示三角洲。此外,还应该在delta中添加更多的零。你知道吗

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。你知道吗

如果datestring的位数超过2UTC,则返回未更改的datestring。你知道吗

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测试

问题是时区“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)')

相关问题 更多 >