八字術是一種古老的算命術。它運用陰陽、五行、幹支、八卦等理論,把人的出生年月日時轉化為八個字,進而推算人的富貴貧賤、禍福吉兇、窮通壽天、名利地位、家庭六親等方面的情況
八字源自古代的中國,是一種利用天幹和地支來準確記錄年、月、日、時的方式,由「年幹,年支」、「月幹,月支」、「日幹,日支」、「時幹,時支」,共八個幹支所組成(共八個字),年、月、日、時的幹支組合稱為「柱」,形成「年柱」、「月柱」、「日柱」、「時柱」,故八字又稱為「四柱」或「四柱八字」。
這種以幹支記錄時間的方式從夏朝開始就已經開始使用,但直至宋朝的徐子平才將人們出生時的幹支八字用來論斷人事禍福,因此命理學中的八字命理又稱「子平八字學」,以紀念徐子平對八字命理學的貢獻。
公曆 2006年1月28日23:50
農曆 丙戌年正月初一日子時
八字 乙酉年己丑月戊午日壬子時
※八字以「立春」節氣為新舊年的交界,丙戌年正月初七辰時(07:27)立春。
公曆 2006年10月10日10:10
農曆 丙戌年八月十九日巳時
八字 丙戌年戊戌月壬申日乙巳時
python bazi.py -husage: bazi.py [-h] [-g] [-r] [--version] year month day timepositional arguments: year year month month day day time timeoptional arguments: -h, --help show this help message and exit -g 是否採用公曆 -r 是否為閏月,僅僅使用於農曆 --version show program's version number and exit
>python bazi.py 1990 2 22 4 -g日期:======================================公曆: 1990年2月22日農曆: 1990年正月廿七日八字:==============================================================================================================年 月 日 時 -------------------------------------------------------------------------------------------------------------- 庚-金 戊-土 戊-土 甲-木 午 寅 午 寅午=己土3 丁火5 寅=戊土1 丙火2 甲木5 午=己土3 丁火5 寅=戊土1 丙火2 甲木5十幹衝:============================================================('甲', '庚') 相衝地支自刑:=========================午五行分數============================================================{'金': 5, '木': 20, '水': 0, '火': 16, '土': 19}身體需要注意:脛足、膀胱腎(比如結石)
#!/usr/bin/env python3# -*- coding: utf-8 -*-# CreateDate: 2019-2-21# -*- coding:utf-8 -*-import sxtwlimport argparseimport collectionsGan = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]gan5 = {"甲":"木", "乙":"木", "丙":"火", "丁":"火", "戊":"土", "己":"土", "庚":"金", "辛":"金", "壬":"水", "癸":"水"}gan_health = { "金":"筋胸、大腸肺", "木":"頭肩、肝膽", "水":"脛足、膀胱腎(比如結石)", "火":"額齒、小腸心臟", "土":"鼻面、脾胃", }Zhi = ["子", "醜", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]zhi5 = {"子":{"癸":8}, "醜":{"辛":1,"癸":2, "己":5}, "寅":{"戊":1,"丙":2, "甲":5}, "卯":{"乙":8}, "辰":{"癸":1,"乙":2, "戊":5}, "巳":{"庚":1,"戊":2, "丙":5}, "午":{"己":3, "丁":5}, "未":{"乙":1,"丁":2, "己":5}, "申":{"戊":1,"壬":2, "庚":5}, "酉":{"辛":8}, "戌":{"丁":1,"辛":2, "戊":5}, "亥":{"甲":3, "壬":5}}ShX = ["鼠", "牛", "虎", "兔", "龍", "蛇", "馬", "羊", "猴", "雞", "狗", "豬"]numCn = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"]Week = ["日", "一", "二", "三", "四", "五", "六"]jqmc = ["冬至", "小寒", "大寒", "立春", "雨水", "驚蟄", "春分", "清明", "穀雨", "立夏", "小滿", "芒種", "夏至", "小暑", "大暑", "立秋", "處暑","白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪"]ymc = ["十一", "十二", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十" ]rmc = ["初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十", "卅一"]gan_hes = { ("甲", "己"): "中正之合 化土", ("乙", "庚"): "仁義之合 化金", ("丙", "辛"): "丙義之合 化水", ("丁", "壬"): "淫慝之合 化木", ("戊", "癸"): "無情之合 化火", }gan_chongs = { ("甲", "庚"): "相衝", ("乙", "辛"): "相衝", ("丙", "壬"): "相衝", ("丁", "癸"): "相衝", }zhi_6hes = { ("子", "醜"): "化土", ("寅", "亥"): "化木", ("卯", "戌"): "化火", ("辰", "酉"): "化金", ("巳", "申"): "化水", ("午", "未"): "化土", }zhi_3hes = { ("申", "子", "辰"): "化水", ("巳", "酉", "醜"): "化金", ("寅", "午", "戌"): "化火", ("亥", "卯", "未"): "化木",}zhi_huis = { ("亥", "子", "醜"): "化水", ("寅", "卯", "辰"): "化木", ("巳", "午", "未"): "化火", ("申", "酉", "戌"): "化金",}zhi_chongs = { ("子", "午"): "相衝", ("醜", "未"): "相衝", ("寅", "申"): "相衝", ("卯", "酉"): "相衝", ("辰", "戌"): "相衝", ("巳", "亥"): "相衝", }zhi_poes = { ("子", "酉"): "相破", ("午", "卯"): "相破", ("巳", "申"): "相破", ("寅", "亥"): "相破", ("辰", "醜"): "相破", ("戌", "未"): "相破", }zhi_poes = { ("子", "酉"): "相破", ("午", "卯"): "相破", ("巳", "申"): "相破", ("寅", "亥"): "相破", ("辰", "醜"): "相破", ("戌", "未"): "相破", }zhi_haies = { ("子", "未"): "相害", ("醜", "午"): "相害", ("寅", "巳"): "相害", ("卯", "辰"): "相害", ("申", "亥"): "相害", ("酉", "戌"): "相害", }zhi_xings = { ("寅", "巳"): "寅刑巳 無恩之刑", ("巳", "申"): "巳刑申 無恩之刑", ("申", "寅"): "申刑寅 無恩之刑", ("未", "醜"): "未刑醜 持勢之刑", ("醜", "戌"): "醜刑戌 持勢之刑", ("戌", "未"): "戌刑未 持勢之刑", ("子", "卯"): "子刑卯 卯刑子 無禮之刑", }zhi_zixings = ['辰', '午', '酉', '亥']description = ''''''parser = argparse.ArgumentParser(description=description, formatter_class=argparse.RawTextHelpFormatter)parser.add_argument('year', action="store", help=u'year', type=int)parser.add_argument('month', action="store", help=u'month', type=int)parser.add_argument('day', action="store", help=u'day', type=int)parser.add_argument('time', action="store", help=u'time', type=float) parser.add_argument('-g', action="store_true", default=False, help=u'是否採用公曆')parser.add_argument('-r', action="store_true", default=False, help=u'是否為閏月,僅僅使用於農曆')parser.add_argument('--version', action='version', version='%(prog)s 0.1 Rongzhong xu 2019 02 21')options = parser.parse_args()lunar = sxtwl.Lunar();if options.g: day = lunar.getDayBySolar(options.year, options.month, options.day)else: day = lunar.getDayByLunar(options.year, options.month, options.day, options.r)gz = lunar.getShiGz(day.Lday2.tg, int(options.time))# 計算甲幹相合 Gans = collections.namedtuple("Gans", "year month day time")gans = Gans(year=Gan[day.Lyear2.tg], month=Gan[day.Lmonth2.tg], day=Gan[day.Lday2.tg], time=Gan[gz.tg])Zhis = collections.namedtuple("Zhis", "year month day time")zhis = Zhis(year=Zhi[day.Lyear2.dz], month=Zhi[day.Lmonth2.dz], day=Zhi[day.Lday2.dz], time=Zhi[gz.dz])print("\n日期:")print("======================================") print("公曆:")print("\t{}年{}月{}日".format(day.y, day.m, day.d))Lleap = "閏" if day.Lleap else ""print("農曆:")print("\t{}年{}{}月{}日".format(day.Lyear0 + 1984, Lleap, ymc[day.Lmc], rmc[day.Ldi]))print("\n八字:")print("="*110) print("{:30s}{:30s}{:30s}{:30s}".format('年', "月", "日", "時"))print("-"*110)print("{:>11s}-{:<11s}{:>11s}-{:<11s}{:>11s}-{:<11s}{:>11s}-{:<11s}".format( gans.year, gan5[gans.year], gans.month, gan5[gans.month], gans.day, gan5[gans.day], gans.time, gan5[gans.time],))print("{:^24s}{:^24s}{:^24s}{:^24s}".format(*zhis))for item in zhis: out = item + '=' for gan in zhi5[item]: out = out + "{}{}{} ".format(gan, gan5[gan], zhi5[item][gan]) + "" print("{:<22s}".format(out), end=' ')def check_subset(gans, db, desc): flag = True for item in db: if set(item).issubset(gans): if flag: print("\n\n{}:".format(desc)) print("="*60) flag = False print(item, db[item]) check_subset(gans, gan_hes, '十幹合')check_subset(gans, gan_chongs, '十幹衝')check_subset(zhis, zhi_6hes, '地支六合') check_subset(zhis, zhi_3hes, '地支三合') check_subset(zhis, zhi_huis, '地支三會') check_subset(zhis, zhi_chongs, '地支相衝') check_subset(zhis, zhi_poes, '地支相破') check_subset(zhis, zhi_haies, '地支相害') check_subset(zhis, zhi_xings, '地支相刑') flag = Truefor item in zhi_zixings: if zhis.count(item) > 1: if flag: print("\n{}:".format("地支自刑")) print("=========================") flag = False print(item) # 計算五行分數scores = {"金":0, "木":0, "水":0, "火":0, "土":0}for item in gans: scores[gan5[item]] += 5 for item in list(zhis) + [zhis.month]: for gan in zhi5[item]: scores[gan5[gan]] += zhi5[item][gan]print("\n\n五行分數") print("="*60) print(scores)print("身體需要注意:{}".format(gan_health[min(scores, key=scores.get)]))
代碼在更新中,參見:https://github.com/china-testing/python-api-tesing/tree/master/bazi