我需要编译一个可以将公历日期转换为玛雅日期的程序。我还需要使用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
我的想法是首先计算自1970年1月1日这个pictun(20 baktuns long)开始以来经过了多少天,然后根据给定的日期添加了自那时以来的日子。
在玛雅历法中,一天被称为亲属。他们的时期(在一个图中)如下:
20 kin = 1 uinal; 18 uinal = 1 tun; 20 tun = 1 katun; 20 katun = 1 baktun
在长计数符号中,1970年1月1日的玛雅日期为12.17.16.7.5'。 Baktun是先写的,然后是katuns等... Mayan的日期从0开始。基本上,uinal的第一个亲属是零,最后一个是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
由于一些奇怪的原因,只有01/01/1970返回正确的玛雅长记法,尽管从整个画像的开头算起来(7,900年的长度!)。对于所有其他日期,尽管我的第二个辅助函数返回正确的值(即使是未来数千年),它似乎在日历中进展得太快。
我想知道哪里出错了。例如,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'
。
答案 0 :(得分:1)
您在日期'15 / 01/1970'中看到负1 kin的问题是由于在计算过程中从每个日期序号中删除了一个。取x%20
将始终返回介于0和19之间的值。从结果中取一个必然会将此范围移至-1到18(包括-1和18)。
添加到daysPassed(date)结果中的数字似乎是1970年1月1日的长形式的转换,每个数字都添加了一个。我假设这样做是为了反驳玛雅历法从零开始计数这一事实,但这是不必要的。玛雅日期0.0.0.0.1.5计数25,而不是151646.但这似乎不是错误的来源,因为从我自己的代码中删除了这个问题,我仍然得到与20-7所描述的相同的结果-1988和21-12-2012。
当我回去并在我的代码中为命名常量切换出所有神奇数字时,我终于根除了错误(它使代码更容易调试,读取和维护)。你说在一个隧道中有18个uinal,在katun中有20个隧道,但这些数字在代码中是相反的。
这是我的代码:
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)))
(我从总天数减去以前的计算,而不是使用模运算符,因为我觉得它更干净。我想这是个人偏好的问题。)
答案 1 :(得分:0)
我可能找到了一些东西。
>>>mayanDate('15/01/1970')
'12/17/16/8/-1'
显然不可能。 -1必须在这里是19,而8必须是7.它似乎过早地过了一个月。仍然没有说明为什么01/01/1970在这里仍然是正确的。不知道那个日期有什么特别之处。