我想从时间戳中获取日期时间,如下所示:3/1/2014 9:55
withdatetime.strptime
或类似的东西。
月份,月中的一天,时不补零,但似乎没有要上市的格式化指令,在这里即能自动分析此。
这样做的最佳方法是什么?谢谢!
我想从时间戳中获取日期时间,如下所示:3/1/2014 9:55
withdatetime.strptime
或类似的东西。
月份,月中的一天,时不补零,但似乎没有要上市的格式化指令,在这里即能自动分析此。
这样做的最佳方法是什么?谢谢!
Answers:
以防万一这个答案对其他人有帮助-我来这里是想我有一个零填充问题,但这实际上与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,而不是一个零:
>>> 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
非模式方式是usedateutil.parse
模块,即使您不知道当前使用的
Ex是什么,它也可以解析常用的日期格式
:
>>> 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)
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
匹配您的输入格式。