将 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')]
重建日期字符串,将 0
的 hour
部分填充固定为 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
我的数据集中有一个不寻常的日期时间格式,我需要将其转换为可用的日期时间对象。
示例如下:'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')]
重建日期字符串,将 0
的 hour
部分填充固定为 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