
一、先把“节气”与“天数”这两个概念说清楚
1. 节气一共 24 个,每月一节一气,节先气后。
2. 起运只看“节”,不看“中气”。
3. 顺行(阳年男、阴年女)看“下一个节”;逆行(阴年男、阳年女)看“上一个节”。
4. 把出生时刻到该节气的时刻换算成完整的天数,零头按 1 天计。
二、三天折一岁、一天折四个月、一个时辰折 10 天的换算表
总天数 ÷ 3 = 起运岁数(可带小数)
余 1 天 → 加 4 个月
余 2 天 → 加 8 个月
余数小于 1 天 → 看有几个时辰,每时辰再加 10 天
举例:
• 若算得 8 天 → 8 ÷ 3 = 2 岁余 2 天 → 2 岁 8 个月起运
• 若算得 7 天半 → 7.5 ÷ 3 = 2.5 岁 → 2 岁 6 个月起运
三、完整的计算步骤(可直接拿去做微调训练数据)
1. 先定阴阳年与性别
‑ 年干甲丙戊庚壬为阳,乙丁己辛癸为阴。
‑ 阳年男、阴年女 → 顺行;阴年男、阳年女 → 逆行。
2. 找到目标节气
把 24 节按时间顺序排好:
立春、惊蛰、清明、立夏、芒种、小暑、立秋、白露、寒露、立冬、大雪、小寒(以上为节)
雨水、春分、谷雨、小满、夏至、大暑、处暑、秋分、霜降、小雪、冬至、大寒(以上为气,只看节)
顺行就往下找最近的“节”;逆行就往上找最近的“节”。
3. 计算间隔天数
公式:
间隔天数 = |出生日期的儒略日 − 目标节气的儒略日|
出生时刻按 24 小时制,节气时刻可查天文历书或授时中心数据。
若出生在北京时间,而节气表是东八区时间,则无需再换算时区;若用世界时,需统一时区。
4. 折算起运岁数
把第 3 步得到的“间隔天数”直接代入:
起运岁数 = 间隔天数 ÷ 3
余数按“一天=四个月、一时辰=10 天”继续细化。
5. 排大运
起运岁数确定后,按顺逆方向,每十年换一柱。
月柱为大运起点:
‑ 顺行 → 月柱干支顺推;
‑ 逆行 → 月柱干支逆推。
四、示范案例(用于微调样本)
【出生】1990 年 3 月 18 日 08:25(东八区),男
【年干】庚午年,庚为阳 → 阳年男 → 顺行
【最近节气】1990 年 3 月 21 日 02:15 春分(节)
【间隔天数】
3 月 18 日 08:25 → 3 月 21 日 02:15
= 2 天 17 小时 50 分 ≈ 2.743 天
【折算】2.743 ÷ 3 = 0.914 岁 ≈ 0 岁 11 个月
【起运】出生后 11 个月开始行大运
【排大运】月柱为庚卯,顺行:
0 岁 11 个月~10 岁 11 个月:庚卯
10 岁 11 个月~20 岁 11 个月:辛辰
……
五、可直接写进代码的伪代码
“`
def qi_yun_d(birth_jd, sex, year_gan):
# 24 节气的儒略日列表(已按东八区计算)
jie_list = […] # 只保留 12 个“节”
# 判断顺逆
yang = year_gan in {‘甲’,’丙’,’戊’,’庚’,’壬’}
forward = (yang and sex == ‘男’) or (not yang and sex == ‘女’)
# 找目标节气
if forward:
target = min([jd for jd in jie_list if jd > birth_jd])
else:
target = max([jd for jd in jie_list if jd < birth_jd])
# 计算天数
days = abs(target - birth_jd)
# 折算岁数
years = days / 3
return years # 可继续换算成年月日
```
六、常见误差提醒
1. 节气时刻必须精确到分钟,差 1 小时就可能多算或少算 0.5 天。
2. 出生证时间与真太阳时若差异较大,应换算成真太阳时再计算。
3. 闰月、闰秒不影响儒略日计算,但节气表必须包含闰年数据。
七、一句话总结
把出生时刻到最近“节”之间的实际天数除以 3,就是起运岁数;余数再按“1 天=4 个月、1 时辰=10 天”细化,即可精确到月甚至日。
