2013-04-07 20 views
17

Mam zamiar zbudować aplikację z Pythonem, która będzie musiała szeroko obsługiwać daty BC (przechowywanie i pobieranie w DB, wykonywanie obliczeń). Większość dat będzie różnych niepewności, takich jak "około 2000BC".Data BC w Pythonie

Wiem, że biblioteka datetime Pythona obsługuje tylko daty od 1 AD.

Do tej pory znalazłem tylko FlexiDate. Czy są jakieś inne opcje?

EDIT: Najlepszym rozwiązaniem byłoby prawdopodobnie zapisać je jako ciągi (mieć ciąg jako podstawowy typ danych) i -jak suggested- mieć klasę zwyczaj datetime co może sprawić pewne liczbową sens. Dla większości wygląda na to, że daty będą się składać tylko z roku. Istnieje kilka interesujących problemów do rozwiązania, takich jak "wczesne 500BC", "od 1600BC do 1500BC", "przed 1800BC".

+9

Niejasny charakter twoich dat może wymagać przewrócenia własnej klasy datetime. –

+0

@JoelCornett Tak, ale niepewność co do rzeczywistych wartości to same prawdziwe wartości. Tak więc dowolny [moduł lub struktura danych] (http://stackoverflow.com/a/19869864/623735), który może wykonać datetime dobrze (obsługuje BC i timedeltas) powinien być używany dla danych Rogera. Jeśli niejasność Rogera można zdefiniować tylko w języku naturalnym, ponieważ musi on określić ilościowo tę niejasność gdzieś w swojej aplikacji (inaczej zapisywałby jego ilości jako struny), wtedy potrzebowałby analizy uczuć (przetwarzanie języka naturalnego). – hobs

Odpowiedz

2

Jest to interesujące pytanie, wydaje się dziwne, że taka klasa jeszcze nie istnieje (re @joel Cornett comment) Jeśli pracujesz tylko w latach, to uprościłoby twoją klasę do obsługi liczb całkowitych zamiast dat kalendarzowych - możesz ewentualnie używać słownika z opisem tekstowym (10 pne) przeciw i wartości całkowitej (-10) EDIT: i googled to:

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

+2

Zaakceptowałem twoją odpowiedź, ponieważ jest bardzo mało dostępnych na ten temat, z wyjątkiem linku, który podałeś i biblioteki, którą już znalazłem. Przygotowuję się do wdrożenia własnej implementacji ... – Roger

2

astronomowie i inżynierowie lotniczym mają do czynienia z datami pne i ciągłej linii czasu , więc jest to kontekst google do wyszukiwania.

Astropy Klasa Time będzie dla Ciebie (a nawet bardziej precyzyjnie i całkowicie, niż Ci się spodziewamy). pip install astropy i jesteś na dobrej drodze.

Jeśli rzucasz własną, powinieneś zapoznać się z niektórymi wzorami w Vallado's chapter on dates. Istnieje wiele nieznanych czynników krówki wymagane do konwersji dat od Julian do Gregorian itp

+0

Dzięki. Interesująca biblioteka. Jednak dokładność dat w mojej aplikacji nie jest określana przez sposób, w jaki kod obsługuje daty, lecz przez historyczną dokładność daty. Na przykład dokładność "około 10.000BC" nie może być dokładniejsza dzięki algorytmowi bazowemu, ale przez (z natury) subiektywną interpretację słowa "około". Innym przykładem jest to, co nazwałbym "datami odniesienia", jak "podczas powstania Imperium Rzymskiego", datowanie, które odnosi się do mniej lub bardziej znanych ram czasowych. To trudny temat. – Roger

+0

Tak, twój problem przetwarzania języka naturalnego można oddzielić od problemu z strukturą danych. NLP może kwantyfikować słowo "o" lub "podczas", lub po prostu zdefiniować je w swoim niestandardowym języku (jak np. Wyszukiwarka zaawansowana Google, z wyrażeniami typu "2 dni temu", myślę). Ale dokładność struktury danych musi być tak dobra, jak * najlepsza * dokładność danych wejściowych, a także obejmować zakres, którego potrzebujesz (daty BC i AD). 'dateutil.parser' pomoże ci w rozwiązaniu problemu z NLP, jeśli załatałeś małpy, aby poradzić sobie ze swoim niestandardowym słownictwem (" około "," podczas "," BC ") i używaj' astropy.Time' zamiast 'datetime'. – hobs

0

To stara sprawa, ale miałem ten sam jeden i znaleźć this article announcing datautil, który został zaprojektowany do obsługi dat, takich jak:

  • daty w odległej przeszłości i przyszłości w tym BC/pne pochodzi
  • daty dzikim różnych formatach: Jan 1890, styczeń 1890, 1 grudnia 1890, wiosna 1890 etc
  • daty różną precyzją: na przykład 1890, 1890/01 ​​(tj sty 1890), 1890-01-02
  • Nieprecyzyjne daty: c1890, 1890 ?, fl 1890 etc

zainstalować tylko

pip install datautil

Odkryłem to tylko przez kilka minut, ale zauważyłem, że nie przyjmuje ono argumentu jako jedynego (tylko unicode) i implementuje swoją własną klasę dat (Flexidate, "nieco rozszerzona wersja ISO8601"), która jest sortowana przydatne może.

>>> 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 

ale niestety ...

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

Niestety dla mnie, byłem

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

Oh dobrze patrząc na coś, co może obsłużyć daty z "circa" (K, Ca, ok, Circ lub cca...) - I zgaduję, że zawsze mogę wysłać żądanie ściągnięcia ;-)