Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的BC日期_Python_Date - Fatal编程技术网

Python中的BC日期

Python中的BC日期,python,date,Python,Date,我打算用Python构建一个应用程序,它需要广泛地处理BC日期(在DB中存储和检索,进行计算)。大多数日期都有各种不确定性,比如“公元前2000年左右” 我知道Python的datetime库只处理从公元1年开始的日期 到目前为止我只找到了。还有其他选择吗 EDIT:最好的方法可能是将它们存储为字符串(将字符串作为基本数据类型),并按照建议使用一个自定义的datetime类,该类可以对其进行一些数字处理。对于大多数人来说,日期似乎只有一年。有一些有趣的问题需要解决,比如“公元前500年早期”、“

我打算用Python构建一个应用程序,它需要广泛地处理BC日期(在DB中存储和检索,进行计算)。大多数日期都有各种不确定性,比如“公元前2000年左右”

我知道Python的datetime库只处理从公元1年开始的日期

到目前为止我只找到了。还有其他选择吗


EDIT:最好的方法可能是将它们存储为字符串(将字符串作为基本数据类型),并按照建议使用一个自定义的datetime类,该类可以对其进行一些数字处理。对于大多数人来说,日期似乎只有一年。有一些有趣的问题需要解决,比如“公元前500年早期”、“公元前1600年到1500年之间”、“公元前1800年之前”。

这是一个有趣的问题,似乎奇怪的是这样一个类还不存在(re@joel Cornett评论)若你们只在几年内工作,那个么它将简化你们的类来处理整数而不是日历日期——你们可能会使用一个字典,上面有文本描述(公元前10年)和整数值(-10) 编辑:我在谷歌上搜索了这个:


天文学家和航空工程师必须处理BC日期和连续的时间线,所以这就是谷歌搜索的背景

的课程将为您服务(甚至比您希望的更精确、更全面)
pip安装astropy
您就可以上路了


如果你自己做,你应该复习中的一些公式。从朱利安到格里高利等日期的转换需要很多模糊的模糊因素。

这是一个老问题,但我发现了相同的问题,该问题旨在处理如下日期:

  • 遥远过去和未来的日期,包括公元前/公元前E年日期
  • 日期格式多种多样:1890年1月、1890年1月、1890年12月1日、1890年春季等
  • 不同精度的日期:例如1890、1890-01(即1890年1月)、1890-01-02
  • 不精确的日期:c1890、1890、佛罗里达1890等
安装只是

pip安装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
不幸的是,我一直在寻找能够处理带有“”的日期的东西(c、ca、ca、circ或cca)

ca=parse(u'ca 1900') [未分析:ca 1900]
哦,好吧-我想我总是可以发送拉请求;-)

NASA Spice函数可以非常好地处理BC,可以进行多种格式的转换。在这些示例中,
begin_date
end_date
包含与输入日期相对应的J2000历元后的TDB秒数:

将SpicePy作为spice导入
#加载闰秒内核
spicey.furnsh(“path/to/leap/second/kernel/naif0012.tls”)
开始日期=spice.str2et('13201公元前05-06 00:00')
结束日期=spice.str2et('17191 A.D.03-15 00:00')
,, 以及 可通过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'
如果indate.year<0.0:
spice_indate=str(indate.year)+“不列颠哥伦比亚省”+sindate[-17:]
spice_indate=str(spice_indate)[1:]
其他:
spice_indate=str(indate.year)+“A.D.”+sindate[-17:]
“2018年公元前03-31 19:33:38.44”
其他功能包括:TIMOUT、TPASE和J2000历元秒之间的转换


这些函数在python中可通过安装获得,例如通过
pip3安装spiceypy

日期的模糊性质可能值得滚动您自己的datetime类。@JoelCornett是的,但实际值中的不确定性本身就是实际值。因此,任何可以很好地处理datetime的数据(处理BC和TimeDelta)都应该用于Roger的数据。如果Roger的模糊性只能用自然语言术语来定义,因为他需要在他的应用程序中的某个地方量化模糊性(否则他将把他的数量记录为字符串),那么他将需要情感分析(自然语言处理).我接受了你的回答,因为除了你提供的链接和我已经找到的图书馆外,关于这个主题的资料很少。我正在准备推出我自己的实现…你能重新验证链接吗?它似乎已经不存在了。谢谢。有趣的图书馆。但是,我的应用程序中日期的精度不是由代码处理或计算日期的方式决定的,而是由日期的历史精度决定的。例如,“大约10.000BC”的准确度不能通过基础算法而通过(固有的)对“大约”一词的主观解释来提高。另一个例子是我称之为“指代日期”,如“罗马帝国崛起期间”,指代的是或多或少为人所知的时间范围。这是一门很难的学科。是的,你的自然语言处理问题可以从你的数据结构问题中分离出来。NLP可以量化“about”或“during”这个词,或者只是用你的自定义语言来定义它(就像谷歌高级搜索一样,我想用“2天前”这样的短语)。但是,您的数据结构精度需要与最佳输入数据精度一样好,并且包含您需要的范围(BC和AD日期)
dateutil.parser
将有助于解决NLP问题,如果您使用monkey补丁来处理自定义词汇表('about'、'during'、'BC'),并使用
astropy.Time
而不是
datetime
。请注意,OP提到的FlexiDate已合并到datautil中。查看发布历史和404错误,我得说这个项目已经死了,而且不能与Python3.x一起使用,因为安装失败了。
>>> ca = parse(u'ca 1900')
<class 'datautil.date.FlexiDate'>  [UNPARSED: ca 1900]
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'