我希望从以下时间戳获取日期时间:3/1/2014 9:55
datetime.strptime
或类似内容。
月份,月份和小时不是零填充,但似乎没有列出here列出的格式化指令,可以自动解析它。
这样做的最佳方法是什么?谢谢!
答案 0 :(得分:99)
strptime
能够解析非填充值。它们被标记为在格式化代码表中填充的事实适用于strftime
的输出。所以你可以使用
datetime.strptime(datestr, "%m/%d/%Y %H:%M")
答案 1 :(得分:5)
strptime
不需要0填充值。见下面的例子
datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M")
output: datetime.datetime(2014, 3, 1, 9, 55)
答案 2 :(得分: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
答案 3 :(得分:1)
非模式方式是使用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)
答案 4 :(得分:0)
你可以看到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