我打算用Python构建一个应用程序,需要广泛处理BC日期(在DB中存储和检索,进行计算)。大多数日期都会有各种不确定因素,例如“公元前2000年左右”。
我知道Python的日期时间库只处理1 AD的日期。
到目前为止,我只找到了FlexiDate。还有其他选择吗?
编辑:最好的方法可能是将它们存储为字符串(将String作为基本数据类型)和-as建议 - 有一个自定义日期时间类,它可以对它有一些数字意义。对于大多数人来说,日期只包含一年。有一些有趣的问题要解决,如“早在公元前500年”,“公元前1600年至公元前1500年”,“公元前1800年之前”。
答案 0 :(得分:7)
天文学家和航空航天工程师必须处理不列颠哥伦比亚省的日期和连续的时间线,因此这是您搜索的谷歌背景。
Astropy的Time
课程适合您(甚至比您希望的更精确,更完整)。 pip install astropy
你正在路上。
如果你自己动手,你应该检查一下Vallado's chapter on dates中的一些公式。将日期从朱利安转换为格里高利等需要很多模糊的软糖因素。
答案 1 :(得分:2)
这是一个有趣的问题,似乎很奇怪,这样的类还不存在(重新@joel Cornett评论)如果你只工作多年只会简化你的类来处理整数而不是日历日期 - 你可以使用带有文本描述(10 BC)和整数值(-10)的字典 编辑:我用谷歌搜索:
答案 2 :(得分:1)
这是一个老问题,但我有同样的问题并找到了this article announcing datautil,它旨在处理以下日期:
- 在遥远的过去和未来的日期,包括BC / BCE日期
- 各种形式的日期:1890年1月,1890年1月,1890年12月1日,1890年春季等。
- 精度不同的日期:例如1890年,1890 - 01年(即1890年1月),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。或cca。)的日期的东西。
>>> ca = parse(u'ca 1900')
<class 'datautil.date.FlexiDate'> [UNPARSED: ca 1900]
哦好吧 - 我想我总是可以发送拉动请求; - )
答案 3 :(得分:1)
NASA Spice功能可以很好地处理BC,可以使用多种格式进行转换。例子: begin_date = spice.str2et('13201 B.C. 05-06 00:00')
end_date = spice.str2et('17191 A.D. 03-15 00:00')
https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/FORTRAN/spicelib/str2et.html 格式: https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/FORTRAN/spicelib/tpartv.html
从日期时间或其他时间方法转换为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纪元秒和从J2000纪元秒转换。 这些函数可以通过spiceypy在python中使用。