从生日来推算八字(从零开始学python)

题目要求:用户输入生日,来得到其生辰八字 


首先生辰八字分为四个部分,分别对应生日的四个部分,即年,月,日,时。并且由天干地支来组成。

十天干:甲,乙,丙,丁,戊,己,庚,辛,壬,癸

十二地支:子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥

由于每部分的干支最初的定位不同,所以我把每一部分都设置了自己的干支list

首先做准备工作,将用户输入的生日转化为农历

from zhdate import ZhDate
from datetime import datetime

birthday=input('请输入出生日期(Y/M/D/H):') #例:2022102321
dt_date = datetime(int(birthday[0:4]),int(birthday[4:6]),int(birthday[6:8]),int(birthday[8:]))
date = str(ZhDate.from_datetime(dt_date))
print(date)

用此方法即可得到生日的农历日期 

一、年干支算法

tiangan_1=['庚','辛','壬','癸','甲','乙','丙','丁','戊','己']
dizhi_1=["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]

#输出年的天干和地支
a,b=0,0
year = int(date[2:6])
year-=1900
year%=60
for _ in range(year):
   a+=1
   b+=1
A = a % 10
B = b % 12

print(tiangan_1[A],dizhi_1[B])

 二、月干支算法

tiangan_2=['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
dizhi_2=["寅","卯","辰","巳","午","未","申","酉","戌","亥","子","丑"]

if date[7] == 1 :
    if date[8] in [1,2,0]:
        month = int(date[7]+date[8])
    else:
        month = int(date[7])
#月干序
mon_gx = (int(date[5])-3)*2 + month
while mon_gx >10 :
     mon_gx-=10
#月支序
     mon_zx = month
print(mon_gx,mon_zx)

三、日干支算法

(因为日干支本身的特点,计算起来比较麻烦,该代码仅供大家参考)

tiangan_3 = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
dizhi_3 = ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]

Day = int(birthday[6]+birthday[7])

Y_2=int(date[4:6])
F_day = ((Y_2+7)*5 + int((Y_2+19)/4) + 15) % 60

if (year % 4) == 0:
    if (year % 100) == 0:
        if (year % 400) == 0:
            Feb = 29
        else:
            Feb = 28
    else:
         Feb = 29
else:
     Feb = 28

mon = int(birthday[4:6])
if mon == 1:
    N_day = (F_day + Day)%60
elif mon == 2:
    N_day = (F_day + 31 + Day)%60
elif mon == 3:
    N_day = (F_day + 31 + Feb + Day)%60
elif mon == 4:
    N_day = (F_day + 31 + Feb + 31 + Day)%60
elif mon == 5:
    N_day = (F_day + 31 + Feb + 31 + 30 + Day)%60
elif mon == 6:
    N_day = (F_day + 31 + Feb + 31 + 30 + 31 + Day)%60
elif mon == 7:
    N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + Day)%60
elif mon == 8:
    N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + 31 + Day)%60    
elif mon == 9:
    N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + 31 + 31 + Day)%60
elif mon == 10:
    N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + Day)%60
elif mon == 11:
    N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + Day)%60
else :
    N_day = (F_day + 31 + Feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + Day)%60

print(tiangan_3[N_day%10-1],dizhi_3[N_day%12-1])

四、时干支算法

tiangan_4 = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
dizhi_4 = ["丑","寅","卯","辰","巳","午","未","申","酉","戌","亥","子"]

H = int(birthday[8:10])
if H == 1 or H == 2:
    H_dz = 1
elif H == 3 or H == 4:
    H_dz = 2
elif H == 5 or H == 6:
    H_dz = 3
elif H == 7 or H == 8:
    H_dz = 4
elif H == 9 or H == 10:
    H_dz = 5
elif H == 11 or H == 12:
    H_dz = 6
elif H == 13 or H == 14:
    H_dz = 7
elif H == 15 or H == 16:
    H_dz = 8
elif H == 17 or H == 18:
    H_dz = 9
elif H == 19 or H == 20:
    H_dz = 10
elif H == 21 or H == 22:
    H_dz = 11
else :
    H_dz = 12
#时天干
H_tg = ((N_day%10) * 2 + int(H/2) - 1)%10

print(tiangan_4[H_tg-1],dizhi_4[H_dz-1])

综上即可得到对应的生辰八字!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值