首页 > 解决方案 > 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对象(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 日期对象的方法是可能的,并且我能够以某种方式在这里迭代数天。

我能想到的唯一“解决方法”(月份范围替换)是 JK在其他地方提交的函数 last_day_month 。但是现在,您能提出任何建议吗,我如何构建一系列日期并对其进行迭代?

标签: python-3.xdatedatetime

解决方案


我可能已经找到了如何进行的方法。

有一个名为 skyfield 的 python 库,它可以保存 BC 日期(存储为 TT - 地球时间),使用 astronomy 库似乎有点矫枉过正,但它适合我的需要。正确格式化可以以 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'))

如果没有人可以提交任何其他(和更有效的方式)如何在 BC 年内迭代数天,我会认为这已解决。


推荐阅读