因此在Python 3中,您可以使用.isoformat()生成ISO 8601日期,但是您无法将isoformat()创建的字符串转换回datetime对象,因为Python自己的日期时间指令不能正确匹配.也就是说,%z = 0500而不是05:00(由.isoformat()生成).
例如:
>>> strDate = d.isoformat()
>>> strDate
'2015-02-04T20:55:08.914461+00:00'
>>> objDate = datetime.strptime(strDate,"%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python34\Lib\_strptime.py", line 500, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "C:\Python34\Lib\_strptime.py", line 337, in _strptime
(data_string, format))
ValueError: time data '2015-02-04T20:55:08.914461+00:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
Run Code Online (Sandbox Code Playgroud)
来自Python的strptime文档:(https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior)
%z UTC格式+ HHMM或-HHMM中的UTC偏移量(如果对象是天真的,则为空字符串).(空),+ 0000,-0400,+ 1030
因此,简而言之,Python甚至不遵守自己的字符串格式化指令.
我知道日期时间在Python中已经很糟糕了,但这真的超出了不合理的范围,变成了愚蠢的土地.
告诉我这不是真的.
我有一个'2009/05/13 19:19:30 -0400'形式的日期字符串.对于尾随时区规范,似乎以前版本的Python可能支持strptime中的%z格式标记,但2.6.x似乎已经删除了它.
将此字符串解析为日期时间对象的正确方法是什么?
我正在尝试将ISO转换为datetime使用以下代码:
dt = datetime.datetime.strptime("2013-07-23T15:10:59.342107+01:00",
"%Y-%m-%dT%H:%M:%S.%f%z")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
'z' is a bad directive in format '%Y-%m-%dT%H:%M:%S.%f%z'
Run Code Online (Sandbox Code Playgroud)
将格式上面的ISO字符串转换为对象的最佳方法是什么datetime?我使用的是Python 2.7.6版.
我正在尝试从电子邮件中检索日期.起初它很容易:
message = email.parser.Parser().parse(file)
date = message['Date']
print date
Run Code Online (Sandbox Code Playgroud)
我收到:
'Mon, 16 Nov 2009 13:32:02 +0100'
Run Code Online (Sandbox Code Playgroud)
但我需要一个不错的日期时间对象,所以我使用:
datetime.strptime('Mon, 16 Nov 2009 13:32:02 +0100', '%a, %d %b %Y %H:%M:%S %Z')
Run Code Online (Sandbox Code Playgroud)
提升了ValueError, since %Z isn't format for +0100.但我在文档中找不到适当的时区格式,只有这个%Z区域.有人可以帮助我吗?
有没有办法用strptime解析"+00:00"格式的时区?例如:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> datetime.strptime("12:34:56+0000", "%X%z")
datetime.datetime(1900, 1, 1, 12, 34, 56, tzinfo=datetime.timezone.utc)
>>> datetime.strptime("12:34:56+00:00", "%X%z")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python34\lib\_strptime.py", line 500, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "C:\Python34\lib\_strptime.py", line 337, in _strptime
(data_string, format))
ValueError: time data '12:34:56+00:00' does not match …Run Code Online (Sandbox Code Playgroud) 我试图将日期字符串转换为datetime对象,如下所示:
dt = datetime.datetime.strptime('2011-07-15 13:00:00+00:00', '%Y-%m-%d %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)
但是,我得到以下错误:
回溯(最近一次调用最后一次):文件"",第1行,文件"/usr/lib/python2.6/_strptime.py",第328行,在_strptime data_string [found.end():]中)ValueError:未转换数据仍为:+00:00
我想我的格式字符串有问题.如何解决?
谢谢
假设我有以下datetime对象:
>>> dt
datetime.datetime(2015, 5, 13, 18, 5, 55, 320000, tzinfo=datetime.timezone(datetime.timedelta(-1, 61200)))
Run Code Online (Sandbox Code Playgroud)
我可以用ISO 8601格式打印该对象,如下所示:
>>> dt.isoformat()
'2015-05-13T18:05:55.320000-07:00'
Run Code Online (Sandbox Code Playgroud)
在Python 3.4下,如果我删除时区中的冒号,我可以解析ISO 8601字符串的字符串:
>>> import re
>>> ts='2015-05-13T18:05:55.320-07:00'
>>> tf="%Y-%m-%dT%H:%M:%S.%f%z"
>>> tsm=re.sub(r'([+-]\d+):(\d+)$', r'\1\2', '2015-05-13T18:05:55.320-07:00')
>>> tsm
'2015-05-13T18:05:55.320-0700'
>>> datetime.datetime.strptime(tsm, tf)
datetime.datetime(2015, 5, 13, 18, 5, 55, 320000, tzinfo=datetime.timezone(datetime.timedelta(-1, 61200)))
Run Code Online (Sandbox Code Playgroud)
在Python 2.7下,情况更糟,因为它%z似乎没有记录的工作:
>>> tsm='2015-05-13T18:05:55.320-0700'
>>> tf="%Y-%m-%dT%H:%M:%S.%f%z"
>>> datetime.datetime.strptime(tsm, tf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
(bad_directive, format)) …Run Code Online (Sandbox Code Playgroud) 我在将气流宏引用“ts”转换为日期时间对象时遇到问题。问题出在字符串末尾的tz上。
from datetime import datetime
timetoday = kwargs['ts']
t = datetime.strptime(timetoday, '%Y-%m-%dT%H:%M:%S%z')
Run Code Online (Sandbox Code Playgroud)
代码没有成功执行,而是抛出错误消息:
time data '2019-08-24T00:00:00+00:00' does not match format '%Y-%m-%dT%H:%M:%S%z'
Run Code Online (Sandbox Code Playgroud)
如果我使用格式略有不同的相同代码,并尝试使用“ds”宏,并且我设法将字符串转换为日期时间对象。
time data '2019-08-24T00:00:00+00:00' does not match format '%Y-%m-%dT%H:%M:%S%z'
Run Code Online (Sandbox Code Playgroud)
更新:阅读http://strftime.org/中的注释并了解其%z格式为+HHMM或-HHMM的 UTC 偏移量(如果对象是幼稚的,则为空字符串)。':'这让我想知道之间的附加+00:00(返回的字符串 ofkwargs['ts']是否是错误的根本原因。但是,我仍然不确定如何正确解析它,因为strptime.
因此,我将宏更改为kwargs['ts_nodash']不返回时区,并暂时继续我的代码。如果有人知道如何做到这一点,我仍然有兴趣了解如何正确完成!谢谢!
from datetime import datetime
timetoday = kwargs['ds']
t = datetime.strptime(timetoday, '%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)