【问题标题】:day is out of range for month using strptime使用 strptime 的日期超出月份的范围
【发布时间】:2015-05-10 19:22:54
【问题描述】:

我在数据框中有一长串需要转换为日期时间的日期,日期格式为“%d%m%Y”,我申请datetime.strptime(x,'%d%m%Y'),它有效直到遇到日期 "3122012",它应该是 datetime.datetime(2012, 12, 3, 0, 0),但它会抛出错误消息:

day is out of range for month

这显然是因为程序认为它是 31/2/2012,它不存在。有什么建议可以避免此类问题吗?谢谢!

【问题讨论】:

  • 那不应该是'03122012'吗?
  • 据说'3122012'是我所拥有的,有什么建议吗?有时您的数据格式不理想...
  • 您是否尝试过编写自己的解析器,而不是依赖datetime.strptime(这需要格式正确的输入)?
  • %d%m%Y 是一种模棱两可的格式。例如,1112012 是指1-11-2012 还是11-1-2012?那么……为什么要以这种格式输入日期,然后尝试将它们解析回来?无论如何,如果你真的想这样做并想出一个消歧规则(并且只是接受某些有效日期永远无法表示!),但是你解决了1112012 问题,这将为你提供一个解决方案3122012 问题免费。
  • @user6396:嗯,要么你必须告诉负责这些数据的人给你有效的数据,要么你必须记录许多完美的日期不能被你的系统处理,因为一些其他你无法控制的傻瓜,然后决定你想让哪一组日期无法访问。允许01-11-2012 但不允许11-01-2012 的解决方案稍微更简单,但这并不意味着它一定是您想要的。 1 月还是 11 月对您来说更重要?

标签: python datetime pandas dataframe


【解决方案1】:

这只是一个更大问题的一部分:您的格式本质上是模棱两可的。*

例如,1-11-201211-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 填充”,因此您的字符串在技术上是无效的......但大多数平台都对非填充数字感到满意,例如,%d-%m-%Y—我相信 POSIX 要求他们快乐,Windows 也快乐,你还关心其他哪些非 POSIX 平台?无论如何,如果不是因为无法将字符串明确转换为有效格式的更大问题,那将只是一个小问题。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2017-07-29
    • 2017-07-29
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多