我在数据框中有很长的日期列表,需要转换为日期时间,日期格式为"%d%m%Y" ,我申请{ {1}},工作正常,直到" 3122012" 为止,该日期应为 datetime.datetime(2012,12,3,0,0),而是抛出错误信息:
datetime.strptime(x,'%d%m%Y')
这显然是因为程序认为它是31/2/2012,并不存在。有什么建议可以避免这些问题吗?谢谢!
答案 0 :(得分:3)
这只是一个更大问题的一部分:你的格式本质上是模棱两可的。 *
例如,1-11-2012
和11-1-2012
都将格式化为1112012
。那么,你打算怎么解析呢?您可以为此创建并实施消歧规则,但无论您选择哪一个,您的系统都无法再表示另一个日期。
如果您对此感到满意,那么您为消除歧义1112012
而实施的任何规则也会自动处理3122012
。例如:
def parse_dmy(s):
if len(s) == 6: s = '0' + s[0] + '0' + s[1:]
elif len(s) == 7: s = '0' + s # or s[0] + '0' + s[1:]
return datetime.strptime(x, '%d%m%Y')
我选择了'0' + s
规则而不是s[0] + '0' + s[1:]
规则,因为前者为此示例提供了03-12-2012
,而后者为您提供了31-02-2012
。但是,同样,这两条规则都不适用于所有价值观。
*此外,%d
和%m
明确表示" 0-padded",因此您的字符串在技术上无效......但大多数平台都对非填充数字感到满意例如,%d-%m-%Y
- 我相信POSIX要求他们感到高兴,Windows很高兴,你还关心其他非POSIX平台吗?无论如何,如果不是因为没有办法明确地将你的字符串转换成有效格式的问题,那只会是一个小问题。