《历术甲子篇》所用为四分历,岁实365又1/4,朔策29又499/940。
殷历创制于公元前427年(周考王十四年),沿用至公元前105年(汉武帝元封六年,次年改历),即本表可以用于参照史料的适用范围。
公元前427年,是年实际天象日月合朔与冬至同日同时,在子时正,是制历的理想起点。历元年干支为己酉。由此用四分术,反推以蔀首为甲子的时日作为历元,即需要反推15蔀共1140年(BC1567年作为历元)。
《历术甲子篇》以十一月(冬至所在月)为岁首,而建寅为正。程序中使用的为年中置闰法。
tiangan = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]
dizhi = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]
yuefen = ["正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"]
direction = ['正东', '正南', '正西', '正北']
suiyang = ["焉逢", "端蒙", "游兆", "彊梧", "徒維", "祝犁", "商橫", "昭陽", "橫艾", "尚章"]
suiyin = ["困敦", "赤奮若", "攝提格", "單閼", "執徐", "大荒落", "敦牂", "協洽", "涒灘", "作鄂", "淹茂", "大淵獻"]
lsjzp = open("历术甲子篇.csv", 'w')
ganzhi = [''] * 60
for i in range(60):
ganzhi[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 # 岁实
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 方向")
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
for i in range(4561): # 一元=3*一纪=3*20=一蔀=3*20*4*一掌=3*20*4*19
# 置闰方法:闰余法
if ry >= 12: # 岁前闰余,即前岁岁末闰余
yry = ry * 12
zry = int((228 - yry) // 7)
month = '闰' + yuefen[(zry - 2 - 1) % 12]
sddy_0, sdxy_0 = qy(sddy_0, sdxy_0, sdrf, sddy + int(yue), sdxy + 499) # 加一个闰月,大余为29,小余为499
ry -= 19
else:
month = ''
sddy_0, sdxy_0 = qy(sddy_0, sdxy_0, sdrf, sddy, sdxy)
ry += 7 # 岁末闰余,每年闰余为7/19月
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] # 输出章首名
rbs = (ce - epoch) // 76
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 - bsgz[rbs % 20]) % 60, sdxy_0,
ganzhi[sddy_0], heshuo(sdxy_0, 940), (dzdy_0 - bsgz[rbs % 20]) % 60, 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(
tiangan[i % 10] + dizhi[(i + 2) % 12], '\t', i + 1, '\t', suiyang[i % 10] + suiyin[(i + 2) % 12], '\t', (
i // 76 + 1) % 20, '', i % 76 + 1, '\t', bu, ' ', i // 19 + 1, '', zhang, ' ', 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 甲子 18 255 壬午 6时30分 10 16 甲戌 12 午时 闰六月 正南
丁巳 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 甲子 30 858 甲午 21时54分 26 8 庚寅 6 卯时 闰三月 正东
庚申 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 甲子 43 521 丁未 13时18分 42 0 丙午 0 子时 闰十一月 正北
癸亥 10 尚章大淵獻 1 10 甲子 1 甲子 37 869 辛丑 22时11分 47 8 辛亥 6 卯时 正东
甲子 11 焉逢困敦 1 11 甲子 1 甲子 1 776 乙丑 19时48分 52 16 丙辰 12 午时 闰八月 正南
乙丑 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 甲子 14 439 戊寅 11时12分 8 8 壬申 6 卯时 闰四月 正东
戊辰 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 甲子 27 102 辛卯 2时36分 24 0 戊子 0 子时 闰正月 正北
辛未 18 昭陽協洽 1 18 甲子 1 甲子 21 450 乙酉 11时29分 29 8 癸巳 6 卯时 正东
壬申 19 橫艾涒灘 1 19 甲子 1 甲子 45 357 己酉 9时6分 34 16 戊戌 12 午时 闰十月 正南
癸酉 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 癸卯 58 20 壬戌 0时30分 50 8 甲寅 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 癸卯 10 623 甲戌 15时54分 6 0 庚午 0 子时 闰三月 正北
己卯 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 癸卯 23 286 丁亥 7时18分 21 24 乙酉 18 酉时 闰十一月 正西
壬午 29 橫艾敦牂 1 29 甲子 2 癸卯 17 634 辛巳 16时11分 27 0 辛卯 0 子时 正北
癸未 30 尚章協洽 1 30 甲子 2 癸卯 41 541 乙巳 13时48分 32 8 丙申 6 卯时 闰八月 正东
甲申 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 癸卯 54 204 戊午 5时12分 48 0 壬子 0 子时 闰四月 正北
丁亥 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 癸卯 6 807 庚午 20时36分 3 24 丁卯 18 酉时 闰正月 正西
庚寅 37 商橫攝提格 1 37 甲子 2 癸卯 1 215 乙丑 5时29分 9 0 癸酉 0 子时 正北
辛卯 38 昭陽單閼 1 38 甲子 2 癸卯 25 122 己丑 3时6分 14 8 戊寅 6 卯时 闰十月 正东
壬辰 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 癸未 37 725 辛丑 18时30分 30 0 甲午 0 子时 闰六月 正北
乙未 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 癸未 50 388 甲寅 9时54分 45 24 己酉 18 酉时 闰三月 正西
戊戌 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 癸未 3 51 丁卯 1时18分 1 16 乙丑 12 午时 闰十一月 正南
辛丑 48 昭陽赤奮若 1 48 甲子 3 癸未 57 399 辛酉 10时11分 6 24 庚午 18 酉时 正西
壬寅 49 橫艾攝提格 1 49 甲子 3 癸未 21 306 乙酉 7时48分 12 0 丙子 0 子时 闰八月 正北
癸卯 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 癸未 33 909 丁酉 23时12分 27 24 辛卯 18 酉时 闰四月 正西
丙午 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 癸未 46 572 庚戌 14时36分 43 16 丁未 12 午时 闰正月 正南
己酉 56 祝犁作鄂 1 56 甲子 3 癸未 40 920 甲辰 23时29分 48 24 壬子 18 酉时 正西
庚戌 57 商橫淹茂 1 57 甲子 3 癸未 4 827 戊辰 21时6分 54 0 戊午 0 子时 闰十月 正北
辛亥 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 癸亥 17 490 辛巳 12时30分 9 24 癸酉 18 酉时 闰六月 正西
甲寅 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 癸亥 30 153 甲午 3时54分 25 16 己丑 12 午时 闰三月 正南
丁巳 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 癸亥 42 756 丙午 19时18分 41 8 乙巳 6 卯时 闰十一月 正东
庚申 67 商橫涒灘 1 67 甲子 4 癸亥 37 164 辛丑 4时11分 46 16 庚戌 12 午时 正南
辛酉 68 昭陽作鄂 1 68 甲子 4 癸亥 1 71 乙丑 1时48分 51 24 乙卯 18 酉时 闰八月 正西
壬戌 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 癸亥 13 674 丁丑 17时12分 7 16 辛未 12 午时 闰四月 正南
乙丑 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 癸亥 26 337 庚寅 8时36分 23 8 丁亥 6 卯时 闰正月 正东
戊辰 75 徒維執徐 1 75 甲子 4 癸亥 20 685 甲申 17时29分 28 16 壬辰 12 午时 正南
己巳 76 祝犁大荒落 1 76 甲子 4 癸亥 44 592 戊申 15时6分 33 24 丁酉 18 酉时 闰十月 正西
庚午 77 商橫敦牂 2 1 癸卯 5 癸卯 39 0 癸卯 0时0分 39 0 癸卯 0 子时 正北