python在日期BC中迭代天数(相当于月份范围)



我想像处理典型日期一样,在BC日期的几天内迭代(或更好地构造一个数组(:

from calendar import monthrange
import datetime
for y in range(2010, 2020):
for m in range(1,13):
for d in range(1, monthrange(y, m)[1]+1):
print(datetime.date(year=y,month=m,day=d))

我知道这在纯python日期时间库中是不可能的(因为日期时间的定义(,因此我仔细研究了之前提出的这个问题,并意识到可能有两个主要选项来实现我的任务:

  • datautil解析的对象(来自datautil.date导入解析((看起来不推荐使用(
  • Astropy对象(来自Astropy.time导入时间(

摆弄datautil对象(python3的包名是python-dateutil(而不是datautil(,导入有点不同(让我更加困惑,因为在我看来,BC日期功能不再存在/或者它是完全不同的库:

from dateutil.parser import parse
parse(-200-01-01) # is an AD date object: datetime.datetime(200, 1, 1, 0, 0)
parse(u'200BC') # reports: ValueError: ('Unknown string format:', '200BC')

说到天体物理学——唯一提到负日期的是FITS部分,但我完全不知道如何使用这个物体。文档非常稀疏,没有示例,我没能让它发挥作用。

如果我在python 3+中创建BC日期对象的方法是可行的,并且我能够在这里迭代几天,那么我有限的知识使我无法在文档中找到任何位置。

我能想到的唯一"变通方法"(monthrange替换(是JK在其他地方提交的函数last_day_month。但就目前而言,你能提出任何建议吗?我如何构建一系列的天数并对其进行迭代?

我可能已经找到了继续的方法。

有一个名为skyfield的python库,可以保存公元前的日期(存储为TT-地球时间(,使用天文学库似乎有些过头了,但它适合我的需求。格式正确的可以用utc/gmt或其他格式显示。。。(如文件所示(

这是一种如何存储BC日期的方法:

from skyfield.api import load
ts = load.timescale()
t1 = ts.utc(-200,1,1)
print(t1.utc_strftime('%Y-%m-%d %H:%M'))

输出:

-200-01-01 00:00

结合JK对每月最后一天的回答,我能够以与AD日期非常相似的方式进行:

from calendar import monthrange
import datetime
from skyfield.api import load
ts = load.timescale()
for y in range(-200, -190):
for m in range(1,13):
for d in range(1, last_day_month(y, m)+1):  # this is JK function to find days in month
print(ts.utc(y,m,d).utc_strftime('%Y-%m-%d %H:%M'))

如果没有人能提交任何其他(更有效的方式(如何在公元前几年的几天内迭代,我会认为这已经解决了。

最新更新