2013-04-07 286 views
17

我正在着手建立一個應用程序與Python將需要廣泛處理BC日期(存儲和檢索在數據庫中,做計算)。大多數日期會有各種不確定性,如「大約2000BC」。公元前日期在Python

我知道Python的日期時間庫只處理AD的日期。

到目前爲止,我只找到FlexiDate。還有其他選擇嗎?

編輯:最好的方法可能是將它們存儲爲字符串(具有字符串作爲基本數據類型)和 - 建議 - 有一個自定義日期時間類,可以使它的數值感覺。對於大多數人來說,日期只會包含一年。有一些有趣的問題需要解決,比如「早期的500BC」,「1600BC到1500BC之間」,「1800BC之前」。

+9

你的日期模糊的性質可能會滾動你自己的日期時間類。 – 2013-04-07 01:28:57

+0

@JoelCornett是的,但實際價值的不確定性本身就是真正的價值。因此,任何可以做日期時間(處理BC和timedeltas)的[模塊或數據結構](http://stackoverflow.com/a/19869864/623735)都應該用於Roger的數據。如果羅傑的模糊性只能用自然語言來定義,那麼他需要量化他應用程序某處的模糊程度(否則他會將他的數量記錄爲字符串),那麼他需要情感分析(自然語言處理)。 – hobs 2013-11-08 22:51:28

回答

2

它是一個有趣的問題,似乎很奇怪,這樣的類還不存在(re @ joel Cornett comment)如果你只在多年工作,它會簡化你的類來處理整數而不是日曆日期 - 你可能可能使用字典的文字說明(10年)反對,整數值(-10) 編輯:我GOOGLE了這一點:

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

+2

我接受了您的答案,因爲除了您提供的鏈接和我已找到的圖書館之外,此主題上的可用信息很少。我正在準備推出我自己的實施... – Roger 2013-04-15 11:40:04

2

天文學家和航天工程師必須處理BC日期和連續的時間線,所以這是您搜索的谷歌環境。

AstropyTime班將爲你工作(甚至更準確,完全比你希望的)。 pip install astropy,你在路上。

如果您推出自己的產品,您應該查看Vallado's chapter on dates中的一些公式。有很多模糊的夢囈因素將日期從朱利安轉換成公曆需要等

+0

謝謝。有趣的圖書館。但是,我的應用程序中日期的精確度不是由代碼處理或計算日期的方式確定的,而是由日期的歷史準確性決定的。例如,「大約10.000BC」的準確度不能通過底層算法更準確,而是通過對「約」這個詞的(本質上)主觀解釋。另一個例子是我稱之爲「推薦日期」,比如「羅馬帝國興起時期」,這個約會指的是或多或少已知的時間框架。這是一個很難的課題。 – Roger 2013-11-09 14:14:06

+0

是的,你的自然語言處理問題可以從你的數據結構問題中分離出來。 NLP可以量化單詞「about」或「during」,或者只是用你的自定義語言來定義它(比如谷歌高級搜索,像「2天前」,我想)。但是,您的數據結構精度需要與* best *輸入數據精度一樣好,並且包含您需要的範圍(BC和AD日期)。 'dateutil.parser'將幫助你解決NLP問題,如果你用它來處理你的自定義詞彙表('about',''期間','BC')並使用'astropy.Time'而不是'datetime'。 – hobs 2013-11-10 20:33:04

0

這是一個老問題,但我有同樣的一個,發現this article announcing datautil,其目的是處理日期,如:

  • 日期在遙遠的過去和未來,包括BC/BCE日期
  • 日期在野生多種格式:揚1890年一月1890年,1890年12月1日,1890年春季變化等精密的
  • 日期:例如: 1890年,1890年至1801年(即1890年1月),1890年1月2日
  • 不精確的日期:c1890,1890年?1890年佛羅里達州等

安裝只是

pip install datautil

我只對它進行了幾分鐘的探索,但注意到它不接受str作爲參數(只有unicode),它實現了它自己的日期類(Flexidate,'ISO8601'的稍微擴展版本),它是sort也許有用。

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

哦(C,CA約,保監會或CCA。) - 我我總是可以發送一個拉請求;-)