允许在python datetime中使用无效日期

时间:2011-07-14 17:56:46

标签: python datetime

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

我需要一个包含生成日期的对象,即使它们无效也是如此。日期时间过于严格,有时候我只知道年份或年份和月份,有时候我会有一个像2011-02-30这样的日期。

那里有一个类似日期时间但可以处理无效日期的模块吗?

如果没有,那么在尽可能少复制功能的同时处理这个问题的最佳方法是什么,并且在可以执行时仍然允许日期数学?

更新

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

我遇到的一个主要问题是使用sqlalchemy和mysqldb将日期从mysql加载到python中 - 如果从mysql中的日期列im mysql加载一个看起来像'2011-01-00'的值,则会得到None在python中。这在任何方面都不会很酷。

2 个答案:

答案 0 :(得分:2)

如果datetime模块太严格,请将其存储为字符串或用零填充的元组作为未知值。

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

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

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

答案 1 :(得分:0)

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

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

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