在Python中解析非零填充时间戳


83

我想从时间戳中获取日期时间,如下所示:3/1/2014 9:55withdatetime.strptime或类似的东西。

月份,月中的一天,时不补零,但似乎没有要上市的格式化指令,在这里即能自动分析此。

这样做的最佳方法是什么?谢谢!

Answers:


130

strptime能够解析非填充值。在格式代码表中注明已将其填充的事实适用于strftime的输出。所以你可以用

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

8

strptimeis不需要0填充的值。见下面的例子

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

2

以防万一这个答案对其他人有帮助-我来这里是想我有一个零填充问题,但这实际上与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

0:12am输入无效。应该是12:12am11: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匹配您的输入格式。
jfs 2015年

谢谢,我确实意识到这是无效的输入,正如我所说,它来自我无法控制的数据源。
hwjp

1

非模式方式是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)

1

您可以在此处看到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

1
在原生Windows,哈希代替破折号:%#d%#m。但是,dash和hash mod都仅在字符串格式(strftime)中需要,而在解析(strptime)中则不需要。
努诺·安德烈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.