在Python datetime中允许无效日期

6 投票
2 回答
2957 浏览
提问于 2025-04-16 21:32

datetime模块可以进行日期的验证和计算,这在你需要准确日期的时候是很不错的。

但我需要一个可以保存生成日期的对象,即使这些日期是无效的。datetime太严格了,有时候我只知道年份,或者只知道年份和月份,有时候我甚至会遇到像2011-02-30这样的日期。

有没有类似datetime的模块,但能处理无效日期的?

如果没有,怎么做才能尽量少重复功能,同时在可以进行日期计算的时候还能进行计算呢?

更新

我这样做的原因是要和多个系统集成,这些系统使用日期但不在乎无效日期(比如mysql和perl),而且我还想能大致了解时间范围。对于模糊的日期计算,可以从已知的时间单位的开始算起(如果我知道年份和月份但不知道日期,就用这个月的第一天;如果我只知道年份而不知道月份和日期,就用一月一日)。这最后一点不是必须的,但如果能有就更好了,我理解为什么这不常见,因为需要特殊日期计算的人可能会自己实现。

我遇到的一个主要问题是,从mysql加载日期到python时,使用sqlalchemy和mysqldb -- 如果你从mysql的日期列加载一个值,比如'2011-01-00',在python中会得到None。这实在是太糟糕了。

2 个回答

0

我没听说过有这样的模块,也觉得可能没有。

我可能会为每个实例存储两个日期:1. 原始输入作为字符串,这个字符串可以包含任何内容,甚至是"N/A",只是为了显示原始值;2. 解析过的“标准化”日期时间对象,这个对象是对输入的最接近的表示。根据具体情况,我会允许使用空值(Null/None),特别是在无法估计的情况下(比如提到的"N/A")。这个方法可以让你随时恢复或更改“估计”,因为你不会丢失任何信息。

如果你不太在意这些,SQLAlchemy允许你自己定义列和数据类型,这样就可以在数据库中透明地将这些值来回转换成字符串列。

2

如果datetime模块太严格了,可以把日期时间存成字符串或者用零填充的元组来表示未知的值。

补充 如果你在把mysql的数据转到python时遇到困难,可以自己写一个适配器类,安全地进行转换(可以参考改变属性行为)。

补充2 一个简单的替代方法是写一个小脚本,遍历你所有的SQL日期,并在那儿进行修正,比如把2011-01-00改成2011-01-01。

补充3 文档建议你可以覆盖反射的列,这样你就可以把时间戳列当作字符串来处理……或者在SQLAlchemy的后续版本中,你可以使用column_property来进行覆盖。

撰写回答