python 将字符串转换为日期时间

3 投票
2 回答
4616 浏览
提问于 2025-04-16 09:31

我有一个循环,里面处理一组数据,其中一个操作是把普通字符串转换成日期时间。整体运行得很好,但有时候会出现奇怪的情况……以下是我知道的情况:

  • 进入这个函数的参数总是完全一样
  • 这些参数的类型也总是一样
  • 第一次运行的时候,总是能顺利通过
  • 但当循环到第二个元素时,大约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

撰写回答