python 将字符串转换为日期时间
我有一个循环,里面处理一组数据,其中一个操作是把普通字符串转换成日期时间。整体运行得很好,但有时候会出现奇怪的情况……以下是我知道的情况:
- 进入这个函数的参数总是完全一样
- 这些参数的类型也总是一样
- 第一次运行的时候,总是能顺利通过
- 但当循环到第二个元素时,大约80%的概率会抛出一个值错误(时间数据与格式不匹配)
- 不过当我再运行一次时,一切又都正常了,然后在下一个元素上又卡住了……
因为我的函数比较大,里面发生了很多事情,所以我决定给你提供一些我写的示例代码,以便更好地说明问题:
data = ['January 20 1999', 'March 4 2010', 'June 11 1819']
dformat = '%B %d %Y'
for item in data:
out = datetime.datetime.strptime(item, dformat)
print out
虽然这在我的程序中明显是有效的,但在这里却不行……我尝试了我能想到的所有方法,但还没有成功,因此我很乐意接受你提供的任何想法,谢谢。
顺便提一下:我总是遇到的错误看起来像这样:
ValueError: time data did not match format: data=March 4 2010 fmt=%B %d %Y
2 个回答
0
这真是有点奇怪……在同一次运行中,地区设置通常是不会改变的。不过,如果你的程序一直这样做的话,你可能需要在代码每次进入循环的时候都调用一次' setlocale'(虽然这个方法看起来不太好)。
7
你可能设置了不同的地区语言。%B在使用英语的地区表示三月,但在其他地区可能就不行了。
举个例子:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'sv_SE.utf8')
'sv_SE.utf8'
>>> import datetime
>>>
>>> data = ['January 20 1999', 'March 4 2010', 'June 11 1819']
>>> for item in data:
... print datetime.datetime.strptime(item, '%B %d %Y')
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/usr/lib/python2.6/_strptime.py", line 325, in _strptime
(data_string, format))
ValueError: time data 'January 20 1999' does not match format '%B %d %Y'
在这里你可以看到,虽然格式是匹配的,但它却说不匹配。这是因为月份名称不一致。把它改成瑞典的月份名称,就又能正常工作了:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'sv_SE.utf8')
'sv_SE.utf8'
>>> import datetime
>>>
>>> data = ['Januari 20 1999', 'Mars 4 2010', 'Juni 11 1819']
>>> for item in data:
... print datetime.datetime.strptime(item, '%B %d %Y')
...
1999-01-20 00:00:00
2010-03-04 00:00:00
1819-06-11 00:00:00
(注意,上面的地区语言'sv_SE.utf8'可能对你不起作用,因为你需要安装这个特定的地区语言。要查看在Unix系统上安装了哪些地区语言,可以在命令行中运行这个命令:
$ locale -a
C
en_AG
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_NG
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZW.utf8
POSIX
sv_FI.utf8
sv_SE.utf8
)