2013-05-16 35 views
1

我需要編譯一個程序,可以將公曆日期轉換爲瑪雅文本。我還需要使用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'

+0

你有沒有在調試器中觀察過這個? – djechlin

+0

我有。然而,這個函數並不需要計算太多,所以效果不大。我所看到的只是出現在親族,烏拉圭等地的不正確的價值觀......而我從1970年1月1日起進一步推進,未來就會越多。儘管我從過去的千年開始算起,但我似乎並沒有看到01/01/1970的計算方法是否正確。 –

+0

有意思。 mayanDate('12 -12-2012')也baktun錯誤。它返回'13 -0-1-11-11'而不是'12 -19-19-17-11'的確非常好奇。也許我不應該從巴克頓開始,但與親屬開始? –

回答

0

我可能找到了一些東西。

>>>mayanDate('15/01/1970') 
'12/17/16/8/-1' 

顯然不可能。 -1在這裏必須是19,而8必須是7.似乎太早了。仍然沒有說出爲什麼01/01/1970在這裏仍然是正確的。不知道那天有什麼特別的。

1

您看到的日期爲'15/01/2070'的陰性1 kin的問題是由於在計算過程中從每個日期序號中刪除了一個。以x%20將始終返回0和19之間的一個值。從結果中取一個必須將此範圍轉換爲-1至18(含)。

添加到daysPassed(日期)結果中的數字似乎是1970年1月1日的長格式的轉換,每個數字加1。我假設這是爲了對抗瑪雅日曆從零開始計數的事實,但沒有必要。瑪雅日期0.0.0.0.1.5計數25,而不是151646.雖然這看起來並不是錯誤的根源,但從我自己的代碼中刪除這個問題,我仍然得到了與20-7所述相同的結果-1988和21-12-2012。

我終於找回了錯誤,當我回去並在我的代碼中爲命名常量切換出所有幻數時(它使代碼更容易調試,讀取和維護)。你說狀態中有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))) 

(我減去先前計算的總天數,而不是使用模運算符,因爲我覺得這是更清潔我想這是個人喜好的問題。)