《历术甲子篇》所用为四分历,岁实365又1/4,朔策29又499/940,亦为实际的殷历(建寅为正)。
殷历创制于公元前427年(周考王十四年),沿用至公元前105年(汉武帝元封六年,次年改历),即本表可以用于参照史料的适用范围。
公元前427年,是年实际天象日月合朔与冬至同日同时,在子时正,位在牵牛初度。符合四分历的蔀首,干支为己酉。由此用四分法,反推以蔀首为甲子的时日作为历元,即需要反推15蔀共1140年(BC1167年作为历元)。
#设某年的上一年十一月冬至合朔,干支为甲子,日月在牛宿初度(即十一月甲子夜半朔旦冬至,日月俱起于牵牛之初)
tiangan = ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
dizhi = ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
ganzhi =['']*60
for i in range(60):
ganzhi[i] = tiangan[i%10]+dizhi[(i)%12]
direction = ['正东','正南','正西','正北']
suiyang = ["焉逢","端蒙","游兆","彊梧","徒維","祝犁","商橫","昭陽","橫艾","尚章"]
suiyin = ["困敦","赤奮若","攝提格","單閼","執徐","大荒落","敦牂","協洽","涒灘","作鄂","淹茂","大淵獻"]
lsjzp = open("历术甲子篇.csv",'w')
#基本常数
yue = 29+499/940 #朔策
zai = 12 * yue #太阴年
sui = 365+1/4 #岁实
sdrf = 940 #朔旦日法
dzrf = 32 #冬至日法
epoch = -1567 #太初元年为《历术甲子篇》历元,非汉武帝太初元年(-104)
sddy = int(zai) % 60 #朔旦大余54
sddy_0 = 0 - sddy #朔旦大余前值
sdxy= (499 * 12 ) % 940 #朔旦小余348
sdxy_0 = 0 - sdxy #朔旦小余前值
dzdy = int(sui) % 60 #冬至大余
dzdy_0 = 0 - dzdy
dzxy = 8 #冬至小余
dzxy_0 = 0 - dzxy
ry = 0
header = ["公元纪年","干支纪年","年序","年名","纪数","蔀数","蔀首","入蔀年","章数","章首","年前十一月朔旦大余","年前十一月朔旦小余","年前十一月朔日干支","年前十一月合朔时刻","年前十一月冬至大余","年前十一月冬至小余","年前十一月冬至干支","年前十一月冬至时刻",'月',"方向"]
lsjzp.write(','.join(header)+'\n')
print("干支纪年","年序","\t 年名","\t\t蔀数","蔀首","入蔀年","章数","章首","前大余","\t前小余","\t前朔日","\t合朔时刻","\t\t后大余","\t后小余","\t冬至干支","\t冬至时刻",' 月',"\t 方向")
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 heshuo(yf,rf): #求合朔时间(余分,日法)
chen = yf / rf * 24 # 合朔时间
chen_h = int(chen)
chen_m = int((chen - chen_h) * 60)
hssj = str(chen_h)+'时'+str(chen_m)+'分'
return hssj
#i+1为是年,i为是年前一年
for i in range(4561): #一元=3*一纪=3*20=一蔀=3*20*4*一掌=3*20*4*19
if ry >= 19: #置闰方法:闰余法
sddy_0,sdxy_0 = qy(sddy_0,sdxy_0,sdrf,sddy+int(yue),sdxy+499) #加一个闰月,大余为29,小余为499
ry -= 19
else:
sddy_0,sdxy_0 = qy(sddy_0,sdxy_0,sdrf,sddy,sdxy)
ry += 7 #每年闰余为7/19月
month = ''
if ry >=19:
yry = (ry-7)*12
for j in range(12):
yry += 7
if yry >=228:
month= '闰' + yuefen[(j - 2) % 12]
break
dzdy_0, dzxy_0 = qy(dzdy_0,dzxy_0, dzrf, dzdy, dzxy)
dz = int((dzxy_0/32)*12)
ce = epoch + i
if sdxy_0 == 0: #朔旦无小余时,为一蔀蔀首
bu = ganzhi[sddy_0] #输出蔀首名(是年前十一月朔旦冬至干支)
if sddy_0 == dzdy_0: #朔旦大余=冬至大余时,为一章章首
zhang = ganzhi[sddy_0] #输出章首名
if ce >= 0: ce += 1 #无公元0年
if ce < 0: ce = 'BC'+str(ce)[1:]+'年'
else: ce = "公元"+str(ce)+'年'
ls = [ce,tiangan[i%10]+dizhi[(i+2)%12],i+1,suiyang[i%10]+suiyin[(i+2)%12],(i//1520)%3+1,(i//76)%20+1,bu,i%76+1,i//19+1,zhang,sddy_0,sdxy_0,
ganzhi[sddy_0], heshuo(sdxy_0, 940),dzdy_0,dzxy_0,ganzhi[dzdy_0],str(dz*2)+' '+dizhi[dz]+'时',month,direction[(dz//3-1)%4]]
lsjzp.write(','.join('%s' %id for id in ls)+'\n')
if i < 77: #输出甲子蔀以供参考
print(ce,'\t ',i+1,'\t',suiyang[i%10]+suiyin[(i+2)%12],'\t',i//1520+1,' ',(i//76+1)%20, '',' ',i%76+1,bu,' ',i//19+1,'',zhang,' ',tiangan[i%10]+dizhi[(i+2)%12],' ',sddy_0, '\t',sdxy_0,'\t',ganzhi[sddy_0],' ',heshuo(sdxy_0, 940),'\t',dzdy_0,'\t',dzxy_0,' \t',ganzhi[dzdy_0],' \t'+str(dz*2)+' '+dizhi[dz]+'时','\t',month,'\t',direction[dz//3-1])
lsjzp.close()
程序运行生成一元三纪4560年的每年年前十一月朔旦冬至的朔闰表(csv格式文件)
甲子蔀 输出参考(源程序在Python脚本下输出对齐):
干支纪年 年序 年名 蔀数 蔀首 入蔀年 章数 章首 前大余 前小余 前朔日 合朔时刻 后大余 后小余 冬至干支 冬至时刻 闰月 方向
甲寅 1 焉逢攝提格 1 甲子 1 1 甲子 0 0 甲子 0时0分 0 0 甲子 0 子时 正北
乙卯 2 端蒙單閼 1 甲子 2 1 甲子 54 348 戊午 8时53分 5 8 己巳 6 卯时 正东
丙辰 3 游兆執徐 1 甲子 3 1 甲子 48 696 壬子 17时46分 10 16 甲戌 12 午时 闰6月 正南
丁巳 4 彊梧大荒落 1 甲子 4 1 甲子 12 603 丙子 15时23分 15 24 己卯 18 酉时 正西
戊午 5 徒維敦牂 1 甲子 5 1 甲子 7 11 辛未 0时16分 21 0 乙酉 0 子时 正北
己未 6 祝犁協洽 1 甲子 6 1 甲子 1 359 乙丑 9时9分 26 8 庚寅 6 卯时 闰3月 正东
庚申 7 商橫涒灘 1 甲子 7 1 甲子 25 266 己丑 6时47分 31 16 乙未 12 午时 正南
辛酉 8 昭陽作鄂 1 甲子 8 1 甲子 19 614 癸未 15时40分 36 24 庚子 18 酉时 正西
壬戌 9 橫艾淹茂 1 甲子 9 1 甲子 14 22 戊寅 0时33分 42 0 丙午 0 子时 闰11月 正北
癸亥 10 尚章大淵獻 1 甲子 10 1 甲子 37 869 辛丑 22时11分 47 8 辛亥 6 卯时 正东
甲子 11 焉逢困敦 1 甲子 11 1 甲子 32 277 丙申 7时4分 52 16 丙辰 12 午时 闰8月 正南
乙丑 12 端蒙赤奮若 1 甲子 12 1 甲子 56 184 庚申 4时41分 57 24 辛酉 18 酉时 正西
丙寅 13 游兆攝提格 1 甲子 13 1 甲子 50 532 甲寅 13时34分 3 0 丁卯 0 子时 正北
丁卯 14 彊梧單閼 1 甲子 14 1 甲子 44 880 戊申 22时28分 8 8 壬申 6 卯时 闰4月 正东
戊辰 15 徒維執徐 1 甲子 15 1 甲子 8 787 壬申 20时5分 13 16 丁丑 12 午时 正南
己巳 16 祝犁大荒落 1 甲子 16 1 甲子 3 195 丁卯 4时58分 18 24 壬午 18 酉时 正西
庚午 17 商橫敦牂 1 甲子 17 1 甲子 57 543 辛酉 13时51分 24 0 戊子 0 子时 闰1月 正北
辛未 18 昭陽協洽 1 甲子 18 1 甲子 21 450 乙酉 11时29分 29 8 癸巳 6 卯时 正东
壬申 19 橫艾涒灘 1 甲子 19 1 甲子 15 798 己卯 20时22分 34 16 戊戌 12 午时 闰9月 正南
癸酉 20 尚章作鄂 1 甲子 20 2 癸卯 39 705 癸卯 18时0分 39 24 癸卯 18 酉时 正西
甲戌 21 焉逢淹茂 1 甲子 21 2 癸卯 34 113 戊戌 2时53分 45 0 己酉 0 子时 正北
乙亥 22 端蒙大淵獻 1 甲子 22 2 癸卯 28 461 壬辰 11时46分 50 8 甲寅 6 卯时 闰6月 正东
丙子 23 游兆困敦 1 甲子 23 2 癸卯 52 368 丙辰 9时23分 55 16 己未 12 午时 正南
丁丑 24 彊梧赤奮若 1 甲子 24 2 癸卯 46 716 庚戌 18时16分 0 24 甲子 18 酉时 正西
戊寅 25 徒維攝提格 1 甲子 25 2 癸卯 41 124 乙巳 3时9分 6 0 庚午 0 子时 闰3月 正北
己卯 26 祝犁單閼 1 甲子 26 2 癸卯 5 31 己巳 0时47分 11 8 乙亥 6 卯时 正东
庚辰 27 商橫執徐 1 甲子 27 2 癸卯 59 379 癸亥 9时40分 16 16 庚辰 12 午时 正南
辛巳 28 昭陽大荒落 1 甲子 28 2 癸卯 53 727 丁巳 18时33分 21 24 乙酉 18 酉时 闰11月 正西
壬午 29 橫艾敦牂 1 甲子 29 2 癸卯 17 634 辛巳 16时11分 27 0 辛卯 0 子时 正北
癸未 30 尚章協洽 1 甲子 30 2 癸卯 12 42 丙子 1时4分 32 8 丙申 6 卯时 闰8月 正东
甲申 31 焉逢涒灘 1 甲子 31 2 癸卯 35 889 己亥 22时41分 37 16 辛丑 12 午时 正南
乙酉 32 端蒙作鄂 1 甲子 32 2 癸卯 30 297 甲午 7时34分 42 24 丙午 18 酉时 正西
丙戌 33 游兆淹茂 1 甲子 33 2 癸卯 24 645 戊子 16时28分 48 0 壬子 0 子时 闰4月 正北
丁亥 34 彊梧大淵獻 1 甲子 34 2 癸卯 48 552 壬子 14时5分 53 8 丁巳 6 卯时 正东
戊子 35 徒維困敦 1 甲子 35 2 癸卯 42 900 丙午 22时58分 58 16 壬戌 12 午时 正南
己丑 36 祝犁赤奮若 1 甲子 36 2 癸卯 37 308 辛丑 7时51分 3 24 丁卯 18 酉时 闰1月 正西
庚寅 37 商橫攝提格 1 甲子 37 2 癸卯 1 215 乙丑 5时29分 9 0 癸酉 0 子时 正北
辛卯 38 昭陽單閼 1 甲子 38 2 癸卯 55 563 己未 14时22分 14 8 戊寅 6 卯时 闰9月 正东
壬辰 39 橫艾執徐 1 甲子 39 3 癸未 19 470 癸未 12时0分 19 16 癸未 12 午时 正南
癸巳 40 尚章大荒落 1 甲子 40 3 癸未 13 818 丁丑 20时53分 24 24 戊子 18 酉时 正西
甲午 41 焉逢敦牂 1 甲子 41 3 癸未 8 226 壬申 5时46分 30 0 甲午 0 子时 闰6月 正北
乙未 42 端蒙協洽 1 甲子 42 3 癸未 32 133 丙申 3时23分 35 8 己亥 6 卯时 正东
丙申 43 游兆涒灘 1 甲子 43 3 癸未 26 481 庚寅 12时16分 40 16 甲辰 12 午时 正南
丁酉 44 彊梧作鄂 1 甲子 44 3 癸未 20 829 甲申 21时9分 45 24 己酉 18 酉时 闰3月 正西
戊戌 45 徒維淹茂 1 甲子 45 3 癸未 44 736 戊申 18时47分 51 0 乙卯 0 子时 正北
己亥 46 祝犁大淵獻 1 甲子 46 3 癸未 39 144 癸卯 3时40分 56 8 庚申 6 卯时 正东
庚子 47 商橫困敦 1 甲子 47 3 癸未 33 492 丁酉 12时33分 1 16 乙丑 12 午时 闰11月 正南
辛丑 48 昭陽赤奮若 1 甲子 48 3 癸未 57 399 辛酉 10时11分 6 24 庚午 18 酉时 正西
壬寅 49 橫艾攝提格 1 甲子 49 3 癸未 51 747 乙卯 19时4分 12 0 丙子 0 子时 闰8月 正北
癸卯 50 尚章單閼 1 甲子 50 3 癸未 15 654 己卯 16时41分 17 8 辛巳 6 卯时 正东
甲辰 51 焉逢執徐 1 甲子 51 3 癸未 10 62 甲戌 1时34分 22 16 丙戌 12 午时 正南
乙巳 52 端蒙大荒落 1 甲子 52 3 癸未 4 410 戊辰 10时28分 27 24 辛卯 18 酉时 闰4月 正西
丙午 53 游兆敦牂 1 甲子 53 3 癸未 28 317 壬辰 8时5分 33 0 丁酉 0 子时 正北
丁未 54 彊梧協洽 1 甲子 54 3 癸未 22 665 丙戌 16时58分 38 8 壬寅 6 卯时 正东
戊申 55 徒維涒灘 1 甲子 55 3 癸未 17 73 辛巳 1时51分 43 16 丁未 12 午时 闰1月 正南
己酉 56 祝犁作鄂 1 甲子 56 3 癸未 40 920 甲辰 23时29分 48 24 壬子 18 酉时 正西
庚戌 57 商橫淹茂 1 甲子 57 3 癸未 35 328 己亥 8时22分 54 0 戊午 0 子时 闰9月 正北
辛亥 58 昭陽大淵獻 1 甲子 58 4 癸亥 59 235 癸亥 6时0分 59 8 癸亥 6 卯时 正东
壬子 59 橫艾困敦 1 甲子 59 4 癸亥 53 583 丁巳 14时53分 4 16 戊辰 12 午时 正南
癸丑 60 尚章赤奮若 1 甲子 60 4 癸亥 47 931 辛亥 23时46分 9 24 癸酉 18 酉时 闰6月 正西
甲寅 61 焉逢攝提格 1 甲子 61 4 癸亥 11 838 乙亥 21时23分 15 0 己卯 0 子时 正北
乙卯 62 端蒙單閼 1 甲子 62 4 癸亥 6 246 庚午 6时16分 20 8 甲申 6 卯时 正东
丙辰 63 游兆執徐 1 甲子 63 4 癸亥 0 594 甲子 15时9分 25 16 己丑 12 午时 闰3月 正南
丁巳 64 彊梧大荒落 1 甲子 64 4 癸亥 24 501 戊子 12时47分 30 24 甲午 18 酉时 正西
戊午 65 徒維敦牂 1 甲子 65 4 癸亥 18 849 壬午 21时40分 36 0 庚子 0 子时 正北
己未 66 祝犁協洽 1 甲子 66 4 癸亥 13 257 丁丑 6时33分 41 8 乙巳 6 卯时 闰11月 正东
庚申 67 商橫涒灘 1 甲子 67 4 癸亥 37 164 辛丑 4时11分 46 16 庚戌 12 午时 正南
辛酉 68 昭陽作鄂 1 甲子 68 4 癸亥 31 512 乙未 13时4分 51 24 乙卯 18 酉时 闰8月 正西
壬戌 69 橫艾淹茂 1 甲子 69 4 癸亥 55 419 己未 10时41分 57 0 辛酉 0 子时 正北
癸亥 70 尚章大淵獻 1 甲子 70 4 癸亥 49 767 癸丑 19时34分 2 8 丙寅 6 卯时 正东
甲子 71 焉逢困敦 1 甲子 71 4 癸亥 44 175 戊申 4时28分 7 16 辛未 12 午时 闰4月 正南
乙丑 72 端蒙赤奮若 1 甲子 72 4 癸亥 8 82 壬申 2时5分 12 24 丙子 18 酉时 正西
丙寅 73 游兆攝提格 1 甲子 73 4 癸亥 2 430 丙寅 10时58分 18 0 壬午 0 子时 正北
丁卯 74 彊梧單閼 1 甲子 74 4 癸亥 56 778 庚申 19时51分 23 8 丁亥 6 卯时 闰1月 正东
戊辰 75 徒維執徐 1 甲子 75 4 癸亥 20 685 甲申 17时29分 28 16 壬辰 12 午时 正南
己巳 76 祝犁大荒落 1 甲子 76 4 癸亥 15 93 己卯 2时22分 33 24 丁酉 18 酉时 闰9月 正西
庚午 77 商橫敦牂 2 癸卯 1 1 癸卯 39 0 癸卯 0时0分 39 0 癸卯 0 子时 正北