在python datetime中允许无效日期



datetime模块进行日期验证和数学运算,当您关心实际情况时,这很好。

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

是否有一个模块在那里,就像datetime,但可以处理无效日期?

如果不是,在尽可能少地重复功能的同时,在可能的情况下允许执行日期数学,最好的方法是什么?

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

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

如果datetime模块过于严格,则将其存储为字符串或对未知值填充零的元组。

编辑如果您在从mysql转换到python时遇到麻烦,请自己编写一个适配器类以安全的方式进行转换(参见更改属性行为)。

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

Edit3文档建议您可以覆盖反射列,以便您可以将时间戳列视为字符串…或者在SQLAlchemy的后续版本中,您可以使用column_property进行覆盖。

我没有听说过这样的模块,我想也没有。

我最终可能会为每个实例存储两个日期:1。将原始输入作为字符串,可以包含任何内容,甚至"N/a",只是为了显示原始值,以及2。经过解析和"规范化"的datetime对象,它是最接近输入的表示。根据目的,我将允许Null/None对象,它确实无法估计(如提到的"N/A"情况)或不。此解决方案将允许您恢复/更改"估计",因为您不会丢失任何信息。

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

相关内容

  • 没有找到相关文章

最新更新