разрешить недопустимые даты в python datetime - PullRequest
6 голосов
/ 14 июля 2011

Модуль datetime выполняет валидацию даты и математику, что хорошо, когда вы заботитесь о реальности.

Мне нужен объект, который содержит сгенерированные даты, даже если они были недействительными. Дата и время слишком строги, так как иногда я знаю только год или только год и месяц, а иногда у меня есть дата, например 2011-02-30.

Существует ли какой-либо модуль, похожий на datetime, но который может обрабатывать недопустимые даты?

Если нет, каков наилучший способ справиться с этим, дублируя как можно меньше функциональных возможностей и все же позволяя вычислять дату, когда это возможно?

UPDATE

Мотивация для этого - интеграция с несколькими системами, которые используют даты и не заботятся о недопустимых датах (mysql и perl) в дополнение к желанию определить основные общие интервалы времени. Для нечеткой даты математика начинается с начала известной единицы времени (если я знаю год и месяц, но не день, используйте первое, если я знаю год, но не месяц или день, сначала используйте январь). Этот последний бит не является необходимым, но был бы хорош, и я понимаю, почему это не распространено, поскольку люди, которым нужна специальная математика даты, вероятно, построят это сами.

Одной из основных проблем, с которыми я сталкиваюсь, является загрузка дат из mysql в python с использованием sqlalchemy и mysqldb - если вы загружаете значение из столбца даты im mysql, которое выглядит как '2011-01-00' в mysql, вы получаете None в питоне. Это не круто с любой натяжкой.

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Если модуль datetime слишком строг, сохраните его в виде строки или кортежа, заполненных нулями для неизвестных значений.

Редактируйте , если у вас возникли проблемы с переводом из mysql в python, напишите себе класс адаптера для безопасного преобразования (см. Изменение поведения атрибута ).

Edit2 простой альтернативой может быть написание короткого сценариячтобы выполнить все ваши даты SQL и внести в них исправления, т.е. изменить 2011-01-00 на 2011-01-01

Edit3 В документах предлагается, что вы можете переопределить отраженные столбцы чтобы вы могли обрабатывать столбцы отметок времени как строки ... или в более поздних версиях SQLAlchemy вы можете использовать column_property для переопределений.

0 голосов
/ 31 августа 2012

Я не слышал о таком модуле и не думаю, что он есть.

Я бы, вероятно, закончил тем, что сохранил две даты для каждого экземпляра: 1. исходный ввод в виде строки, которая может содержать что угодно, даже «N / A», только для отображения исходного значения, и 2. анализ и « нормализованный объект datetime, который является ближайшим представлением ввода. В зависимости от цели я мог бы разрешить объекты Null / None, где они действительно не могут быть оценены (например, упомянутый случай «N / A») или нет. Это решение позволит вам отменить / изменить «оценку», поскольку вы не потеряете какую-либо информацию.

Если вас это не сильно волнует, SQLAlchemy позволяет объявлять ваш собственный столбец и типы данных для прозрачного преобразования таких значений назад и вперед в строковый столбец в БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...