python - Python 中的长计数玛雅日期

标签 python

我需要编译一个程序,可以将公历日期转换为玛雅日期。我还需要使用 01/01/1970 作为引用日期。

以下辅助功能均正常工作,没有错误。

# turns dates into tuples


def dmj(date):

"""
>>> dmj('01/01/1970')
(1, 1, 1970)
>>> dmj('00012+00012+02012')
(12, 12, 2012)
"""

tup = ()
for i in date:
    if i.isdigit() == False and i != ' ':
        date = date.replace(i, ' ')

number_str = ''
for i in date:
    number_str += i
    if i == ' ':
        number = int(number_str)
        tup += (number,)
        number_str = ''
tup += (int(number_str),)
return tup

# counts days that have passed since 01/01/1970

def daysPassed(date):
"""
>>> daysPassed('01/01/1970')
0
>>> daysPassed('20-7-1988')
6775
>>> daysPassed('00012+00012+02012')
15686
"""

from datetime import date
tup = dmj(date)
begin = date(1970, 1, 1)
end = date(tup[2], tup[1], tup[0])
passed = abs(end - begin)        
return passed.days

我的想法是首先计算自 01/01/1970 这个 pictun(20 baktuns 长)开始以来已经过去了多少天,然后根据给定的日期添加从那时起经过的天数。

在玛雅历法中,一天被称为“亲属”。它们的周期(一张图片内)如下:

20 kin = 1 uinal; 18 uinal = 1 吨; 20 盾 = 1 卡盾; 20 卡顿 = 1 巴克顿

在长计数表示法中,01/01/1970 的玛雅日期是“12.17.16.7.5”。首先写的是 Baktun,然后是 katuns,等等...玛雅日期从 0 开始。基本上,uinal 的第一个亲属是数字 0,最后一个数字是 19,总共 20 个。

我首先编译了以下内容:

def mayanDate(date, separation='')

"""
>>> mayanDate('01/01/1970')
'12/17/16/7/5'
>>> mayaDate('20-7-1988', separator='/')
'12/18/15/4/0'
>>> mayaDate('00012+00012+02012', separator='-')
'12-19-19-17-11'
>>> mayaDate('21 12 2012', separator='+')
'13+0+0+0+0'
>>> mayaDate('26.03.2407')
'14.0.0.0.0'
"""
days = daysPassed(date) + 13 * 144000 + 18 * 7200\
 + 17 * 400 + 8 * 20 + 6     
baktun = str((days //((20 **3) * 18)) - 1)
days = days % ((20 **3) * 18)    
katun = str((days //((20 **2) * 18)) - 1)
days = days % ((20 **2) * 18)    
tun = str((days // (20 **2)) - 1)
days = days % (20 **2)    
uinal = str((days // 20) - 1)
days = days % 20 - 1

kin = str(days)
mayanlist = [baktun, katun, tun, uinal, kin]

for i in date:
    if i.isdigit() == False and separator == '':
        separator = i
        break

mayandate = separator.join(mayanlist)
return mayandate

出于某种奇怪的原因,尽管从整个图片的开头开始计算(长度为 7,900 年!),但只有 01/01/1970 返回正确的玛雅长符号。对于所有其他日期,尽管我的第二个辅助函数返回了正确的值(即使是 future 几千年),但它似乎在日历中前进得太快。

我想知道哪里出错了。例如 mayanDate('20-7-1988') 返回 '12-18-15-6-0' 而不是 '12-18-15- 4-0'mayanDate('21 12 2012') 返回 '13 0 1 12 0' 而不是 '13 0 0 0 0 '

最佳答案

您所看到的日期“15/01/1970”的负 1 亲属问题是由于在计算过程中从每个日期序数中删除了 1 个造成的。采用 x%20 将始终返回 0 到 19 之间的值(含 0 和 19)。从结果中取 1 必然会将该范围更改为 -1 到 18(含)。

添加到 daysPassed(date) 结果中的数字似乎是 1/1/1970 的长形式的转换,每个数字都加了一个。我假设这样做是为了反驳玛雅历法从零开始计数的事实,但这是不必要的。玛雅日期 0.0.0.0.1.5 计数为 25,而不是 151646。但这似乎不是错误的根源,因为从我自己的代码中删除了这个问题,我仍然得到与 20-7 中所述相同的结果-1988 年和 2012 年 12 月 21 日。

当我返回并将代码中的所有魔数(Magic Number)切换为命名常量时,我​​终于根除了错误(这使得代码更容易调试、阅读和维护)。您声明 tun 中有 18 uinal,katun 中有 20 tun,但这些数字在代码中颠倒了。

这是我的代码:

def mayanDate(date_str, seperation=','):
days_in_kin     = 1
kin_in_uinal    = 20
uinal_in_tun    = 18
tun_in_katun    = 20
katun_in_baktun = 20

days_in_uinal   = days_in_kin * kin_in_uinal
days_in_tun     = days_in_uinal * uinal_in_tun
days_in_katun   = days_in_tun * tun_in_katun
days_in_baktun  = days_in_katun * katun_in_baktun

days_1970 = 12 * days_in_baktun \
    + 17 * days_in_katun\
    + 16 * days_in_tun\
    + 7 * days_in_uinal\
    + 5 * days_in_kin

total_days = daysPassed(date_str) + days_1970

baktun = total_days // days_in_baktun
total_days -= baktun * days_in_baktun
katun = total_days // days_in_katun
total_days -= katun * days_in_katun
tun = total_days // days_in_tun
total_days -= tun * days_in_tun
uinal = total_days // days_in_uinal
total_days -= uinal * days_in_uinal
kin = total_days // days_in_kin

print seperation.join(map(str, (baktun, katun, tun, uinal, kin)))

(我从总天数中减去前面的计算,而不是使用模运算符,因为我觉得这样更干净。我想这是个人喜好的问题。)

关于python - Python 中的长计数玛雅日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589697/

相关文章:

python - tensorflow 值错误: expected flatten_input to have shape: the correct way to load and process image?

python - hashlib 与 Python 中的 crypt.crypt() 对比。为什么会有不同的结果?

python - 如何在整个项目中拥有一些上下文?

Python 函数相当于 * 来扩展参数?

python - 使用 URL 处理器正确格式化规范的 URL 结构

Python:在 pandas 中读取 #0000000000 格式的 Excel 列时如何保留前导零

python - 当我尝试使用 pip 安装软件包时出现错误

python - 在 VS Code python 终端中运行 python 时遇到问题

python - 来自嵌套字典的值

python - Pandas 通过索引从 HDF5 中获取特定行