在Python中parsing非零填充时间戳

我想从时间戳得到date时间,如下所示: 3/1/2014 9:55 with datetime.strptime ,或者其他的东西。

月份,月份的date和小时不是零填充的,但是似乎没有列出的格式化指令可以自动parsing。

最好的方法是什么? 谢谢!

strptime能够parsing非填充值。 它们在格式代码表中填充的事实适用于strftime的输出。 所以你可以使用

 datetime.strptime(datestr, "%m/%d/%Y %H:%M") 

非模式的方式是使用dateutil.parse模块,它可以parsing常见的date格式,即使你不知道它当前使用的是什么
例如:

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

strptime是不需要0填充的值。 看下面的例子

 datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M") output: datetime.datetime(2014, 3, 1, 9, 55) 

以防万一这个答案帮助别人 – 我来到这里认为我有一个零填充的问题,但它实际上是做与12:00 vs 00:00和%I格式化程序。

%I格式化程序旨在匹配12小时制时间,可以select零填充。 但是根据你的数据源,你可能会得到的数据表明午夜或中午实际上是零,例如:

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

但是我们并不总是控制我们的数据源! 我对这个边缘案例的解决scheme是捕捉exception,尝试使用%Hparsing它,并快速检查我们是否处于我们认为处于边缘的情况。

 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 

你可以在这里看到strftime文件,但实际上它们并不是在所有平台上都运行良好,例如, %-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