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

3

我有一个循环,在其中尝试处理一组数据,其中一个动作是将普通字符串转换为日期时间。除了有时会发生奇怪的事情之外,一切都正常...以下是我知道的情况:

  • 进入函数的参数始终完全相同
  • 这些参数始终是相同的类型
  • 第一次运行它,它总是可以通过
  • 当在循环中到达第二个元素时,大约80%会抛出一个值错误(time data did not match format)
  • 但在我再次运行它之后,一切正常,并且它卡在下一个元素上...

因为我的函数相当复杂,有很多事情正在发生,我决定提供一些我在此处编写的示例代码,以供澄清:

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

3
考虑发布那些出了问题的代码,而不是一些正常运行的代码。这有助于找到错误所在。 - Sven Marnach
提供的代码没有问题(您可以在这里看到它运行的情况)。我们需要一个不同的样例,实际上能够引起您所描述的错误。 - Alex Vidal
1
@Sven Marnach:他确实这样做了。他指出虽然代码可以运行,但在另一个上下文中却无法正常工作。因此,问题在于上下文。 - Lennart Regebro
@Lennart Regebro:根据提供的信息,我不会想到那个答案,但你显然做到了 :) - Sven Marnach
@Sven Marnach:我在许多国家生活过,并实现了几个日历系统。我对日期问题知道得太多了。别让我开始谈时区。 :) - Lennart Regebro
2个回答

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

)


谢谢,有了你的帮助,我终于理解了。我没想到我的循环会涉及不同的语言,这可能是它每次到达循环中的下一个元素时都会崩溃的原因......也许我错了,这只是我的想法。无论如何,非常感谢你的帮助。谢谢。 - nabizan

0

挺奇怪的...在同一次运行中,语言环境通常不会改变。但是,如果您的程序一直这样做,您可能希望每次代码进入循环时调用 'setlocale'(丑陋的解决方案,我知道)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接