2013-04-07 290 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。) - 我我总是可以发送一个拉请求;-)