我需要編譯一個程序,可以將公曆日期轉換爲瑪雅文本。我還需要使用01/01/1970作爲參考日期。長計數瑪雅Python中的日期
以下輔助功能相應地工作,沒有錯誤。
# 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
我的想法是先計算出,因爲這pictun(20個baktuns長)在01/01/1970之初多少天過去了,然後添加自那時以來,根據給定的日期一天天過去。
在瑪雅曆法中,一天被稱爲親屬。他們的時期(在一個pictun內)如下:
20 kin = 1 uinal; 18 uinal = 1 tun; 20 tun = 1 katun; 20 katun = 1 baktun
在長統計符號中,01/01/1970的瑪雅日期是'12.17.16.7.5'。 Baktun首先被寫,然後katuns等等。瑪雅日期從0開始。基本上,一個uinal的第一個親屬是零號,最後一個號碼是19,共有二十個。
我先編譯如下:
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返回正確的瑪雅長的符號,儘管從整個pictun的開始計數(7900年長!)。對於所有其他日期,儘管我的第二個輔助函數返回了正確的值(即使在將來數千年),但它似乎在整個日曆中提前過快。
我想知道錯誤在哪裏。例如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'
。
你有沒有在調試器中觀察過這個? – djechlin
我有。然而,這個函數並不需要計算太多,所以效果不大。我所看到的只是出現在親族,烏拉圭等地的不正確的價值觀......而我從1970年1月1日起進一步推進,未來就會越多。儘管我從過去的千年開始算起,但我似乎並沒有看到01/01/1970的計算方法是否正確。 –
有意思。 mayanDate('12 -12-2012')也baktun錯誤。它返回'13 -0-1-11-11'而不是'12 -19-19-17-11'的確非常好奇。也許我不應該從巴克頓開始,但與親屬開始? –