2013-04-07 3 views
17

Я собираюсь создать приложение с Python, которое должно будет обрабатывать даты BC широко (хранить и извлекать в БД, выполнять вычисления). Большинство дат будут иметь различные неопределенности, например «около 2000BC».BC даты в Python

Я знаю, что библиотека datetime для Python обрабатывает только даты от 1 AD.

Пока что я нашел только FlexiDate. Есть ли другие варианты?

EDIT: Лучший подход, вероятно, будет хранить их в виде строки (есть строки в качестве основного типа данных) и -as suggested- есть пользовательский класс DATETIME, которые могут сделать некоторый числовой смысл. Для большинства это похоже, что даты будут состоять только из года. Есть некоторые интересные проблемы для решения, такие как «ранние 500BC», «между 1600BC и 1500BC», «до 1800BC».

+9

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

+0

@JoelCornett Yea, но неопределенности в реальных значениях - это просто реальные значения. Поэтому для данных Роджера должны использоваться любые [модуль или структура данных] (http://stackoverflow.com/a/19869864/623735), которые могут хорошо использовать datetime (обрабатывать BC и timedeltas). Если неопределенность Роджера может быть определена только в терминах естественного языка, так как ему нужно количественно определить ту неопределенность где-то в своем приложении (иначе он будет записывать свои количества в виде строк), тогда ему понадобится анализ чувств (обработка естественного языка). – hobs

ответ

2

Его интересный вопрос, кажется странным, что такой класс еще не существует (комментарий @joel Cornett). Если вы работаете только за несколько лет, это упростит ваш класс для обработки целых чисел, а не календарных дат - возможно, использовать словарь с текстовым описанием (10 до н.э.) против и целочисленного значения (-10) EDIT: Я гугле это:

http://code.activestate.com/lists/python-list/623672/

+2

Я принял ваш ответ, поскольку в этой теме очень мало доступных мест, кроме ссылки, которую вы предоставили, и библиотеки, которую я уже нашел. Я готовлюсь к качке моей собственной реализации ... – Roger

2

Астрономы и аэрокосмической промышленности приходится иметь дело с датами до нашей эры и непрерывной линии времени , так что это контекст google для вашего поиска.

AstropyTime класс будет работать для вас (и даже более точно и полностью, чем вы надеялись). pip install astropy, и вы на своем пути.

Если вы откатываете свои собственные, вы должны рассмотреть некоторые из формул в Vallado's chapter on dates. Есть много неясных факторы выдумки, необходимые для преобразования даты из Julian григорианской и т.д.

+0

Спасибо. Интересная библиотека. Однако точность дат в моем приложении не определяется тем, как код обрабатывает или вычисляет даты, а также историческую точность даты. Например, точность «около 10.000BC» не может быть более точна с помощью лежащего в основе алгоритма, но посредством (по сути) субъективной интерпретации слова «около». Другим примером является то, что я бы назвал «датами датирования», например «во время подъема Римской империи», датировкой, которая относится к более или менее известному временному периоду. Это сложный вопрос. – Roger

+0

Да, ваша проблема с обработкой естественного языка может быть отделена от вашей проблемы с структурой данных. NLP может количественно определить слово «около» или «во время» или просто определить его на вашем пользовательском языке (например, в расширенном поиске google с фразами типа «2 дня назад», я думаю). Но ваша точность структуры данных должна быть такой же хорошей, как и точность ввода * наилучших *, а также охватывать необходимый диапазон (даты BC и AD). 'dateutil.parser' поможет с вашей проблемой NLP, если вы обезвредили ее, чтобы иметь дело с вашим специальным словарем (« около »,« во время »,« BC ») и использовать« astropy.Time »вместо' datetime'. – hobs

+0

Ссылка на класс «Время» теперь выглядит следующим образом: http://docs.astropy.org/en/stable/api/astropy.time.Time.html – colidyre

0

Это старый вопрос, но у меня был то же, и нашел this article announcing datautil, который предназначен для обработки дат, как:

  • Даты в далеком прошлом и будущем, включая BC/BCE даты
  • Даты в диком различных форматах: январь 1890, январь 1890, 1 декабря 1890, весна 1890 и т.д.
  • Даты различной точности: например, 1890, 1890-01 (т.е. Jan 1890), 1890-01-02
  • неточные даты: c1890, 1890 ?, П 1890 и т.д.

Установка только

pip install datautil

Я исследовал его всего несколько минут, но отметил, что он не принимает str как аргумент (только unicode), и он реализует свой собственный класс даты (Flexidate, «немного расширенная версия ISO8601»), которая сортируется полезного, может быть.

>>> from datautil.date import parse 
>>> parse('Jan 1890') 

error: 'str' object has no attribute 'read' 

>>> fd = parse(u'Jan 1890') 
<class 'datautil.date.FlexiDate'> 1890-01 

fd.as_datetime() 
>>> datetime.datetime(1890, 1, 1, 0, 0) 

>>> bc = parse(u'2000BC') 
<class 'datautil.date.FlexiDate'> -2000 

но увы ...

>>> bc.as_datetime() 
ValueError: year is out of range 

К сожалению для меня, я искал что-то, что может обрабатывать даты с "circa"

>>> ca = parse(u'ca 1900') 
<class 'datautil.date.FlexiDate'> [UNPARSED: ca 1900] 

Ну (с, са, ок, CIRC или CCA...) - Я думаю, я всегда могу отправить запрос на тягу ;-)

Смежные вопросы