python-3.x - 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 日期对象的方法是可能的,并且我能够以某种方式在这里迭代数天。
我能想到的唯一“解决方法”(月份范围替换)是 JK在其他地方提交的函数 last_day_month 。但是现在,您能提出任何建议吗,我如何构建一系列日期并对其进行迭代?
解决方案
我可能已经找到了如何进行的方法。
有一个名为 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 年内迭代数天,我会认为这已解决。
推荐阅读
- bash - OSX粘贴命令不粘贴整行
- php - PDO::FETCH_GROUP 为每一行返回重复值,为什么?
- sql - 这个 SQL 查询的最佳索引是什么?
- python - 列表Python中的比较总和
- java - ServletRequest getAsyncContext() 上的 IllegalStateException
- python - 如何将python字符串转换为数组
- arrays - 如何检查多维数组是否为空
- django - 如何使用 django-partial-date 和 SelectDateWidget 管理部分日期?
- r - 运行一段代码多次更改 R 中的某些参数(如 SAS 中的宏)
- regex - 用于连接正则表达式和变量的 PowerShell 脚本