【发布时间】:2014-10-06 10:46:12
【问题描述】:
我想从时间戳中获取日期时间,如下所示:3/1/2014 9:55 和 datetime.strptime,或类似的东西。
月份、日期和小时不是零填充的,但似乎没有列出的格式化指令here 能够自动解析。
这样做的最佳方法是什么?谢谢!
【问题讨论】:
我想从时间戳中获取日期时间,如下所示:3/1/2014 9:55 和 datetime.strptime,或类似的东西。
月份、日期和小时不是零填充的,但似乎没有列出的格式化指令here 能够自动解析。
这样做的最佳方法是什么?谢谢!
【问题讨论】:
strptime 能够解析非填充值。它们在格式化代码表中被记录为填充的事实适用于strftime 的输出。所以你可以使用
datetime.strptime(datestr, "%m/%d/%Y %H:%M")
【讨论】:
strptime 不需要填充 0 的值。请参阅下面的示例
datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M")
output: datetime.datetime(2014, 3, 1, 9, 55)
【讨论】:
非模式方式是使用dateutil.parse模块,它可以解析常见的日期格式,即使你不知道它当前使用的是什么
例如:
>>> import dateutil.parser
>>>
>>> utc_time = '2014-08-13T00:00:00'
>>> verbose_time = '13-Aug-2014'
>>> some_locale = '3/1/2014 9:55'
>>> dateutil.parser.parse(utc_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(verbose_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(some_locale)
datetime.datetime(2014, 3, 1, 9, 55)
【讨论】:
以防万一这个答案对其他人有帮助 - 我来到这里以为我遇到了零填充问题,但它实际上与 12:00 vs 00:00 和 %I 格式化程序有关。
%I 格式化程序旨在匹配 12 小时制的小时数,可选填零。但根据您的数据源,您可能会得到表明午夜或中午实际上为零的数据,例如:
>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'
strptime 真正想要的是 12,而不是 0:
>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)
但我们并不总是控制我们的数据源!对于这种边缘情况,我的解决方案是捕获异常,尝试使用 %H 对其进行解析,并快速检查我们是否处于我们认为处于的边缘情况中。
def get_datetime(string):
try:
timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
except ValueError:
# someone used zero for midnight?
timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
assert string.lower().endswith('am')
assert timestamp.hour == 0
return timestamp
【讨论】:
0:12am 输入无效。应该是12:12am。 11:59 pm 后跟 12:00 am,而不是 0:00am。可能有多种方法以错误的时间格式提供数据,例如,输入可能使用两位数年份 (%y) 而不是四位数年份 (%Y) 或日/月可能被交换 (%m/%d与%d/%m) 等。日/月情况可能不明确,例如2015/10/12 是“10 月12 日”还是“12 月10 日”?顺便说一句,您应该使用%Y/%m/%d 而不是%m/%d/%Y 来匹配您的输入格式。
你可以看到strftime文档here,但实际上它们并不是在所有平台上都能正常工作,例如,%-d,%-m在python 2.7的win7上不工作,所以你可以这样完成
>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now())
>>> print(date_str)
2016-5-23
【讨论】:
%#d、%#m。但破折号和散列 mods 仅在字符串格式 (strftime) 中需要,在解析 (strptime) 中不需要。