Подтвердить что ты не робот

Дочерние даты в Python

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

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

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

РЕДАКТИРОВАТЬ: Лучший подход, вероятно, заключается в том, чтобы хранить их как строки (иметь String в качестве базового типа данных) и, как предполагается, иметь пользовательский класс datetime, который может сделать некоторое числовое значение этого, Для большинства это похоже, что даты будут состоять только из года. Есть несколько интересных проблем для решения, таких как "ранние 500BC", "между 1600BC и 1500BC", "до 1800BC".

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Если вы свернули свои собственные, вам следует ознакомиться с некоторыми формулами в главе Vallado о датах. Для преобразования дат из юлианского в григорианский и т.д. Требуется много неясных факторов.

Ответ 3

Функции NASA Spice очень хорошо обрабатывают BC с помощью преобразований из нескольких форматов. В этих примерах begin_date и end_date содержат секунды TDB после эпохи J2000, соответствующие датам ввода:

import spiceypy as spice

# load a leap second kernel
spicey.furnsh("path/to/leap/second/kernel/naif0012.tls")

begin_date = spice.str2et('13201 B.C. 05-06 00:00')
end_date = spice.str2et('17191 A.D. 03-15 00:00')  

Документация по str2et(), входной формат документации, а также Файлы ядра в течение второй секунды доступны через домашнюю страницу NASA Spice.

преобразование из метода datetime или другого времени в spice очень просто:

if indate.year < 0.0:
    spice_indate = str(indate.year) + ' B.C. ' + sindate[-17:]
    spice_indate = str(spice_indate)[1:]
else: 
    spice_indate = str(indate.year) + ' A.D. ' + sindate[-17:]

'2018 B.C. 03-31 19:33:38.44'

Другие функции включают в себя: TIMOUT, TPARSE и преобразование в и из J2000 эпох эпохи.

Эти функции доступны в Python через spiceypy, установите, например, через pip3 install spiceypy

Ответ 4

Это старый вопрос, но у меня был тот же самый и нашел эту статью, объявившую datautil, которая предназначена для обработки дат типа:

  • Даты в далеком прошлом и будущем, включая даты BC/BCE
  • Даты в различных форматах: январь 1890, январь 1890, 1 дек. 1890, Spring 1890 и т.д.
  • Даты различной точности: например. 1890, 1890-01 (т.е. Январь 1890), 1890-01-02
  • Неточные даты: c1890, 1890?, fl 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" (c., ca, ca., circ. or cca.)

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

Ну, я думаю, я всегда могу отправить запрос на тяну, -)