将非常规/自定义时间格式转换为日期时间对象

时间:2018-12-17 18:09:24

标签: python timezone datetime-format

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

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

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

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

但无法识别格式。

我当前的解决方法是使用正则表达式将datetime列(数据在pandas数据框中)解析为两列,如下所示:

dataframe

,然后根据“ 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)')

添加: 这不是一个问题:“如何将UTC时区转换为本地时区”我的数据集包含具有UTC的行以及东部时区的行。我的问题是该格式不是ISO格式,而是一些人类可读的自定义格式。

3 个答案:

答案 0 :(得分:1)

问题在于您的时区'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)')

答案 1 :(得分:1)

  

问题:使用datetime.datetime.strptime()

轻松完成此任务的方法

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

如果日期字符串的位数超过2个00,则返回未更改的日期字符串。

  

注意UTC格式必须为strptime
  文档:strftime-and-strptime-behavior

%Z%z
  

输出

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

使用Python测试:3.4.2

答案 2 :(得分:0)

应该是这样的:

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”代表增量。另外,您应该在增量中添加更多零。