1. 程式人生 > >古六歷朔閏表及歷表(BC722-BC104)

古六歷朔閏表及歷表(BC722-BC104)

黃帝歷朔閏表及歷表(正月建子,曆元天正冬至合朔)

tiangan = ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
dizhi = ["子","醜","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
gz =['']*60
for i in range(60):
	gz[i] = tiangan[i%10]+dizhi[(i)%12]
bsgz=[0]*20 #蔀首干支
for i in range(20):
   bsgz[i] = (i*39)%60
yue = 29+499/940 #朔策
zai = 12 * yue #太陰年
sui = 365+1/4 #歲實
sddy = int(zai) % 60 #朔旦大餘
sdxy= (499 * 12 ) % 940 #朔旦小余
sdrf = 940 #朔旦日法
zqi = sui/12 #中氣30又14/32
zqrf = 32
zqdy = 30
zqdy_0 = 51 - zqdy
zqxy = 14
zqxy_0 = 0 - zqxy
ydy = int(yue)
ydy_0 = 40 - ydy
yxy = 499 #每月小余499
yxy_0 = 113 - yxy
yueri_0 = -29
zqrq = -2
ly = -1350
lygz = 27
hdlb = []
yuefen =["正月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]
jieqi = ["冬至","小寒","大寒","立春","雨水","驚蟄","春分","清明","穀雨","立夏","小滿","芒種","夏至","小暑","大暑","立秋","處暑","白露","秋分","寒露","霜降","立冬","小雪","大雪"]
nlrq=["初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","二一","二二","二三","二四","二五","二六","二七","二八","二九","三十"]
j = 0
ce = -722
hdlsrb = open("黃帝歷朔閏表.csv",'w')
hdllb = open("黃帝歷歷表.csv",'w')

def qy(dy_0,xy_0,rf,dy,xy): #求大小余分(餘分前值,日法,餘分)
    xy_0 += xy
    if xy_0 >= rf:
        dy_0 += 1
        xy_0 -= rf
    dy_0 = (dy_0 + dy) % 60
    return dy_0,xy_0

def dxy(xy_0): #判斷大小月
    if xy_0 < 441:
        return "小"
    else:
        return "大"

def wzqy(dy_0,xy_0,sdy_0): #無中氣月(氣大小余、朔大餘、干支序)
   global zqdy_0,zqxy_0,yueri_0,yueri
   if dxy(yxy_0) == "大": yueri = 30
   else:yueri = 29
   if (int(dy_0+xy_0/32+zqi)-sdy_0)%60>=yueri:  #上一個中氣值加中氣日數即預推下一個中氣的值,下一中氣不在該月中則該月無中氣
      x = True
      return x,dy_0,xy_0
   else:
      dy_0, xy_0 = qy(dy_0, xy_0, zqrf, zqdy, zqxy)
      x = False
      return x,dy_0,xy_0

jqdy_0,jqxy_0 = qy(zqdy_0,zqxy_0,zqrf,zqdy//2,zqxy//2)
header = ["公元紀年","干支紀年","蔀名","入蔀年","月份","朔日干支","朔日大餘","朔日小余","中氣","中氣干支","中氣大餘","中氣小余","中氣日期"]
hdlsrb.write(','.join(header)+'\n')
header2 = ["公元紀年","干支紀年","月份","中氣","中氣干支","節氣","節氣干支",'']
hdllb.write(','.join(header2+nlrq)+'\n')

for i in range(10000):#BC427-BC222(235月*10章+16年*12月+5閏)2547
   ydy_0, yxy_0 = qy(ydy_0, yxy_0, sdrf, ydy, yxy)
   zr,zqdy_0,zqxy_0 = wzqy(zqdy_0,zqxy_0,ydy_0)
   wjq, jqdy_0, jqxy_0 = wzqy(jqdy_0, jqxy_0, ydy_0)
   rbs = (-ly + ce) // 76
   jq = jieqi[(j * 2 - 1) % 24]
   jqgz = gz[(bsgz[rbs % 20] + jqdy_0) % 60]
   if wjq == True:
       jq = "無節氣"
       jqgz = "\t"
   if zr == True:
      ce = -722 + j // 12
      if j % 12 < 0: ce -= 1
      j -= 1
      srb =[ce, gz[(-ly+ce+lygz)%60],gz[bsgz[rbs%20]],(-ly-722+j//12)%76+1,"閏" + yuefen[j % 12] + dxy(yxy_0),gz[(bsgz[rbs%20]+ydy_0)%60], ydy_0 % 60,yxy_0, "無中氣",'','','','']
      hlb=[ce, gz[(-ly+ce+lygz)%60],"閏" + yuefen[j % 12] + dxy(yxy_0),"無中氣",'',jq,jqgz,'']
   else:
      ce = -722 + j // 12
      if j % 12 < 0: ce -= 1
      srb =[ce, gz[(-ly+ce+lygz)%60],gz[bsgz[rbs%20]],(-ly-722+j//12)%76+1,yuefen[j % 12] + dxy(yxy_0), gz[(bsgz[rbs%20]+ydy_0)%60],ydy_0 % 60,yxy_0,jieqi[j%12*2], gz[(bsgz[rbs%20]+zqdy_0)%60],zqdy_0%60,zqxy_0,nlrq[(zqdy_0-ydy_0)%30]]
      hlb=[ce, gz[(-ly+ce+lygz)%60],yuefen[j % 12] + dxy(yxy_0),jieqi[j%12*2], gz[(bsgz[rbs%20]+zqdy_0)%60],jq,jqgz,'']
      yueri_0 = yueri
   for k in range(yueri_0):
      hdlb.append(gz[(bsgz[rbs%20]+ydy_0+k) % 60])
   if j % 12 == 0 and j != 0 and zr == False:
       hdlsrb.write('\n')
       hdllb.write('\n')
   j += 1
   hdlsrb.write(','.join('%s' % id for id in srb) + '\n')
   hdllb.write(','.join('%s' % id for id in hlb+hdlb) + '\n')
   hdlb.clear()