#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#author:Wos
#天干地支五运六气计算脚本
from datetime import date,datetime
import sys
h = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
e = ['寅','卯','辰','巳','午','未','申','酉','戌','亥','子','丑']
e_ = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥','子']
#将时间转换成时辰
def shichen():
now = int(datetime.now().strftime('%H'))
if int(now) % 2 == 1:
print("当前时辰:"+e_[int((int(now)+1)/2)]+"时")
else:
print("当前时辰:"+e_[int(int(now)/2)]+"时")
#五运六气相关数据
wuxing=['木(风)','火(热)','土(湿)','金(燥)','水(寒)']
tiangan={'甲己':'土(湿)','乙庚':'金(燥)','丙辛':'水(寒)','丁壬':'木(风)','戊癸':'火(热)'}
dizhi={'亥巳':'厥阴风木(风)','子午':'少阴君火(热)','丑未':'太阴湿土(湿)','寅申':'少阳相火(暑)','卯酉':'阳明燥金(燥)','辰戌':'太阳寒水(寒)'}
dizhi2={'亥巳':'厥阴风木(风)','子午':'少阴君火(热)','寅申':'少阳相火(暑)','丑未':'太阴湿土(湿)','卯酉':'阳明燥金(燥)','辰戌':'太阳寒水(寒)'}
wuyunshijian='''
1/21~4/4 4/4~6/16 6/16~8/28 8/28~11/9 11/9~1/21
'''
liuqishijian='''
1/21~3/21 3/21~5/21 5/21~7/23 7/23~9/23 9/23~11/23 11/23~1/21
'''
#六十干支常数
sixtyJiazi={'甲子甲午':'热化二,雨化五,燥化四。上咸寒,中苦热,下酸热',
'乙丑乙未':'热化寒化胜复同。灾七宫,湿化五,清化四,寒化六。上苦热,中酸和,下甘热',
'丙寅丙申':'火化二,寒化六,风化三。上成寒,中咸温,下辛温',
'丁卯丁酉':'清化热化胜复同。灾三宫,燥化九,风化三,热化七。上苦小温,中辛和,下咸寒',
'戊辰戊戌':'寒化六,热化七,湿化五。上苦温,中甘和,下甘温',
'己巳己亥':'风化清化胜复同,灾五宫,风化三,湿化五,火化七。上辛凉,中甘和,下咸寒',
'庚午庚子':'热化七,清化九,燥化九,上咸寒,中辛温,下酸温',
'辛未辛丑':'雨化风化胜复同。灾一宫。雨化五,寒化一,上苦热,中苦和,下苦热',
'壬申壬寅':'火化二,风化八。上咸寒,中酸和,下辛凉',
'癸酉癸卯':'寒化雨化胜复同。灾九宫。燥化九,热化二,上苦小温,中咸温,下咸寒',
'甲戌甲辰':'寒化六,湿化五。上苦热,中苦温,下苦温',
'乙亥乙巳':'热化寒化胜复同。灾七宫,风化八,清化四,火化二。上辛凉,中酸和,下咸寒',
'丙子丙午':'热化二,寒化六,清化四。上威寒,中咸热,下酸温',
'丁丑丁未':'清化热化胜复同。灾三宫。雨化五,风化三,寒化一。上苦温,中辛温,下甘热',
'戊寅戊申':'火化七,风化三。上咸寒,中甘和,下辛凉',
'己卯已酉':'风化清佔胜复同。灾五宫。清化九,雨化五,热化七。上苦小温,中甘和,下成寒',
'庚辰庚戌':'寒化一,清化九,雨化五。上苦热,中辛温,下甘热',
'辛巳辛亥':'雨化风化胜复同。灾一宫。风化三,寒化一,火化七。上辛凉,中苦和,下成寒',
'壬午壬子':'热化二,风化八,清化四。上咸寒,中酸凉,下酸温',
'癸未癸丑':'寒化雨化胜复同。灾九宫。雨化五,火化二,寒化一。上苦温,中咸温,下甘热',
'甲申甲寅':'火化二,雨化五,风化八。上咸寒,中咸和,下辛凉',
'乙酉乙卯':'热化寒化胜复同。灾七官。燥化四,清化四,热化二。上苦小温,中苦和,下咸寒',
'丙戌丙辰':'寒化六,雨化五。上苦热,中咸温,下甘熱',
'丁亥丁巳':'清化热化胜复同。灾三宫。风化三,火化七。上辛凉,中辛和,下咸寒',
'戊子戊午':'热化七,清化九。上咸寒,中甘寒,下酸温',
'己丑己未':'风化清化胜复同。灾五宫,雨化五,寒化一。上苦熱,中甘和,下甘熟',
'庚寅庚申':'火化七,清化九,风化三。上咸寒,中辛温,下辛凉',
'辛卯辛酉':'雨化风化胜复同。灾一宫。清化九,寒化一,热化七。上苦小温,中苦和,下咸寒',
'壬辰壬戌':'寒化六,风化八,雨化五。上苦温,中酸和,下甘温',
'癸巳癸亥':'寒化雨化胜复同。灾九宫。风化八,火化二。上辛凉,中咸和,下咸寒'}
hentuluoshu = '''
==========================================================
(偶数为阴,奇数为阳)
河图 洛书
27 南
4 9 2
83 105 49 东3 5 7 西
8 1 6
61 北
==========================================================
先天八卦 后天八卦
兑2 乾1 巽5 巽4 离9 坤2
离3 中 坎6 震3 中5 兑7
震4 坤8 艮7 艮8 坎1 乾6
==========================================================
五行方位图 季节(农历)
木 火 土 夏(4~6月)
木 土 金 春(1~4月) 长夏(6~8月) 秋(8~11月)
土 水 金 冬(11~次1月)
==========================================================
五行生克图
木 x 土 x 水 x 火 x 金
木 > 火 > 土 > 金 > 水
========================================================================================================
十二经纳地支 十二经纳天干
巳(脾) 午(心) 未(小) 申(膀) 丙(小)丁(心)
太阳> 辰(胃) 酉(肾) 甲(肝)乙(胆 ) 戊(胃)己(脾) 庚(大)辛(肺)
阳明> 卯(大) 戌(心包) 壬(膀,三焦)癸(肾,心包)
寅(肺) 丑(肝) 子(胆) 亥(焦)
^ ^ ^ ^
少阳 太阴 少阴 厥阴
========================================================================================================
一阴 二阴 三阴
(巳亥) (子午) (丑未)
(先)司天|厥阴风木->少阴君火->太阴湿土
||
(后)在泉|少阳相火->阳明燥金->太阳寒水
(寅申) (卯酉) (辰戌)
一阳 二阳 三阳
先由地支确定司天,在泉选择其阴阳的对立面,即一阴对一阳,二阴对二阳,三阴对三阳
========================================================================================================
天干地支的计算
4 5 6 7 8 9 0 1 2 3
'甲','乙','丙','丁','戊','己','庚','辛','壬','癸'
根据年尾数找天干,比如1991年,尾数为1,所以天干为辛
1 2 3 4 5 6 7 8 9 10 11 12
'寅','卯','辰','巳','午','未','申','酉','戌','亥','子','丑'
地支的计算公式 (年份+7)%12,如果余数为0,则地支为丑,否则就是余数对应的位置
比如1991年的地支 (1991+7)%12=6,所以是未
========================================================================================================
'''
#将年份转换成干支
def hefs(year):
if year == "":
year = date.today().strftime("%Y")
rd = (int(year)%10)
h_year = h[rd-3-1] #天干
rd_2 = (int(year)+7)%12
dz = "" #地支
ganzhi = ""#干支
if rd_2 == 0:
dz = str(e[11])
ganzhi = str(h_year)+str(e[11])
print("目标:"+str(h_year)+str(e[11])+"年")
elif rd_2 != 0:
dz = str(e[rd_2-1])
ganzhi = str(h_year)+str(e[rd_2-1])
print("目标:"+str(h_year)+str(e[rd_2-1])+"年")
#根据天干获取岁运
idx = 0
suiyun = ""
print(hentuluoshu,end="")
print(" 五运六气\n")
for key,value in sixtyJiazi.items():
if str(ganzhi) in str(key):
print("常数:"+str(value))
break
for k in tiangan:
if str(h_year) in str(k):
for j in h:
if str(h_year) == j:
idx = h.index(j)%2
if idx == 0:
suiyun = tiangan[k]
print("\n中运:"+tiangan[k]+"(太)")
else:
suiyun = tiangan[k]
print("\n中运:"+tiangan[k]+"(少)")
#主运计算
idx_ = idx #备份
print(wuyunshijian,end="")
#客运计算,天运,变动
wuxing_ = []
for k in wuxing:
if str(suiyun) == k:
wuxing_ = wuxing[wuxing.index(k):]+wuxing[:wuxing.index(k)]
print("客运(天):",end="")
idx_ = idx #备份
for k in wuxing_:
if wuxing_.index(k) == 0:
if idx == 0:
print(str(k)+"(太)",end="")
idx = 1
else:
print(str(k)+"(少)",end="")
idx = 0
else:
if idx == 0:
print(" "+str(k)+"(太)",end="")
idx = 1
else:
print(" "+str(k)+"(少)",end="")
idx = 0
idx = idx_ #还原
#主运,地运 不变
print("\n主运(地):",end="")
for k in wuxing:
if wuxing.index(k) == 0:
if idx == 0:
print(str(k),end="")
idx = 1
else:
print(str(k),end="")
idx = 0
else:
if idx == 0:
print(" "+str(k),end="")
idx = 1
else:
print(" "+str(k),end="")
idx = 0
idx = idx_ #还原
#六气的计算
#司天 上半年 天气
#在泉 下半年 地气
dizhi_ = []
sitian = "" #司天,是客气的第三个
print("\n--------------------------------------------------------------------------------")
for k in dizhi:
dizhi_.append(dizhi[k])
for k in dizhi:
if str(dz) in str(k):
sitian = dizhi[k]
print("\n司天(上):"+dizhi[k])
for j in dizhi_:
if dizhi[k] == j:
idx = dizhi_.index(j)
print("在泉(下):"+dizhi_[(3+idx)%6])
#主气
dizhi2_ = []
print(liuqishijian,end="")
for k in dizhi2:
dizhi2_.append(dizhi2[k])
#客气
print("客气(天):",end="")
keqi = []
for j in dizhi_:
if str(sitian) == j:
idx = dizhi_.index(j)-2
keqi = dizhi_[idx:]+dizhi_[:idx]
for k in keqi:
if keqi.index(k) == 0:
print(k,end="")
else:
print(","+k,end="")
print("\n主气(地):",end="")
for k in dizhi2_:
if dizhi2_.index(k) == 0:
print(k,end="")
else:
print(","+k,end="")
print("\n")
if __name__ == "__main__":
try:
year = sys.argv[1]
shichen()
hefs(year)
except:
print("eg. python hefs.py 2023|less")