【问题标题】:allowing invalid dates in python datetime在 python datetime 中允许无效日期
【发布时间】:2012-08-31 17:52:50
【问题描述】:

datetime 模块执行日期验证和数学运算,这在您关心现实时很好。

我需要一个对象来保存生成的日期,即使它们是无效的。日期时间太严格了,因为有时我只知道年份或只知道年份和月份,有时我的日期像 2011-02-30。

是否有类似 datetime 但可以处理无效日期的模块?

如果没有,在尽可能少地复制功能并在可能执行的情况下仍然允许日期数学时,最好的方法是什么?

更新

这样做的动机是与使用日期的多个系统集成,并且不关心无效日期(mysql 和 perl),此外还希望能够分辨基本的一般时间范围。对于模糊日期数学从已知时间单位的开头开始(如果我知道年和月但不知道日,则使用第一个,如果我知道年但没有月或日,请先使用一月)。最后一点不是必需的,但会很好,我明白为什么它不常见,因为需要特殊情况日期数学的人可能会自己构建它。

我遇到的主要问题之一是使用 sqlalchemy 和 mysqldb 将日期从 mysql 加载到 python 中——如果你从 mysql 中的日期列加载一个值,在 mysql 中看起来像“2011-01-00”,你会得到 None在蟒蛇。这一点都不酷。

【问题讨论】:

  • 当你不知道每个月有多少天时,约会数学会不会很困难?也许我不太明白你在找什么。
  • @Pat B 我的猜测是:假设现实生活,直到离开。另外,@SynapticUnderrun 如果你解释了你为什么想要/需要这个,你可能会得到更多的回应(我也只是感兴趣)。
  • 如果您不关心日期是否有效,请将其存储为字符串。 datetime 模块在内部使用纪元时间,因此它将遵循日历。如果这是您担心公差的原因,还可以查看 pytz 模块以获取时区支持。
  • 你应该得到一个 None,因为它不是一个日期,它是一堆由 - 连接的数字。

标签: python datetime


【解决方案1】:

如果日期时间模块过于严格,则将其存储为字符串或用零填充的元组以表示未知值。

编辑如果您在从 mysql 转换为 python 时遇到问题,请为自己编写一个适配器类以安全的方式进行转换(请参阅Changing attribute behaviour)。

Edit2 一个简单的替代方法可能是编写一个简短的脚本来运行所有 SQL 日期并在那里进行更正,即将 2011-01-00 更改为 2011-01-01

Edit3 文档建议您可以override reflected columns,这样您就可以将时间戳列视为字符串......或者在更高版本的 SQLAlchemy 中,您可以使用 the column_property 进行覆盖。

【讨论】:

  • 如何让 mysqldb 使用我的课程而不是日期时间?
  • 适配器类听起来并不有趣,更改无效日期是对实际数据的更改(在我的项目范围内不允许,但 column_property sqlalchemy 选项看起来像我想要的(我的专栏的 cast() 属性)。
【解决方案2】:

我还没有听说过这样的模块,也不认为有。

我可能最终会为每个实例存储两个日期:1. 原始输入为字符串,可以包含任何内容,甚至“N/A”,仅用于显示原始值,以及 2. 已解析和“ normalized" 日期时间对象,它是最接近输入的表示形式。根据目的,我将允许 Null/None 对象确实无法估计(如提到的“N/A”案例)或不允许。此解决方案将允许您恢复/更改“估计”,因为您不会丢失任何信息。

如果您不太关心它,SQLAlchemy 允许声明您自己的列和数据类型,以便透明地将这些值来回转换为数据库中的字符串列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多