风火编程--干支纪年法的完整转换(可用于八字推算)

版权声明:风火编程, 欢迎指正. https://blog.csdn.net/weixin_42620314/article/details/83515688

严谨的干支纪年法转换

干支纪年法的年,月分界点与公历不同, 因此单纯的使用公历日期转换,得到的结果必然有一部分是错误的. 目前通用的解决方案是使用数据库存储几百年的数据,然后通过查库实现. 本程序已经考虑了以上内容, 节气时间通过爬虫获取,没有数据库操作.
需要的加个粉点个赞, 直接拿走. 厚道人, 不要那几个垃圾币了.
欢迎讨论, 本人qq及微信号码:77245741

完整源码奉上

# coding: utf-8

import re
from math import ceil
from datetime import datetime

import requests
from lxml import etree
tg = '癸甲乙丙丁戊己庚辛壬'  # 天干字符串
dz = '亥子丑寅卯辰巳午未申酉戌'  # 地址字符串

def to_ganzhi(year, mon, day, hour=1, min=1, sec=1):
    """
    干支纪年转换
    :param year: 公历年, int 2018
:param mon: 公历月, int 1
:param day: 公历日, int 1
:param hour: 24进制小时, int 1
:param min: 分钟, int 1
:param sec: 秒, int 1
:return: 干支纪年法表示的时间, xx年xx月xx日xx时
    """
    date_time = datetime.strptime(
        "{}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}".format(year, mon, day, hour, min, sec), "%Y-%m-%d %H:%M:%S")
        
    lichun = get_jieqi(year)
    jieqi = get_jieqi(year, mon)

    year4compute = year - 1 if date_time < lichun else year
    mon4compute = (mon + 11) % 12 if date_time < jieqi else mon
    # 年干支
    year_g = (year4compute+7) % 10  # 年干
    year_z = (year4compute + 9) % 12  # 年支
    
    # 月干支
    mon_g = (year % 5*2 + mon4compute + 3) % 10  # 月干
    mon_z = (mon4compute + 1) % 12  # 月支

    # 日干支
    date_init = datetime.strptime("0001-01-05", "%Y-%m-%d")
    date = datetime.strptime("{}-{:0>2}-{:0>2}".format(year, mon, day), "%Y-%m-%d")
    dete = (date - date_init).days
    dete4compute = dete + 1 if hour >= 23 else dete

    day_g = dete4compute % 10  # 日干
    day_z = (dete4compute + 8) % 12  # 日支

    # 时干支
    hour_g = int((dete4compute % 5 * 2 + ceil(hour/2) + 9) % 10)  # 时干
    hour_z = int((ceil(hour/2) + 1) % 12)  # 时支

    print("args_g", year_g, mon_g, day_g, hour_g)
    print("args_z", year_z, mon_z, day_z, hour_z)
    print(type(hour_z))

    gz = "{}{}年  {}{}月 {}{}日 {}{}时".format(
        tg[year_g],
        dz[year_z],
        tg[mon_g],
        dz[mon_z],
        tg[day_g],
        dz[day_z],
        tg[hour_g],
        dz[hour_z]
        )
    print(gz)


def get_jieqi(start_year, mon=2, limit=1):
    """
    获取节气时间, 如果要存库,可以传入limit参数
    ::param start_year:  起始年份
:param limit:需要获取的年数
:return: 数据生成器
    """
    jieqi = {
        2: "lichun",
        3: "jingzhe",
        4: "qingming",
        5: "lixia",
        6: "mangzhong",
        7: "xiaoshu",
        8: "liqiu",
        9: "bailu",
        10: "hanlu",
        11: "lidong",
        12: "daxue",
        1: "xiaohan"
    }

    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0"}

    if limit == 1:
        url = "https://jieqi.51240.com/%d_%s__jieqi/" % (start_year, jieqi[mon])
        response = requests.get(url=url, headers=headers)
        html = etree.HTML(response.text)
        ret = html.xpath('//div[@class="jieqi_neirong_biaoti_beizhu"]/strong/text()')[0]
        data = re.sub(r"[年月]", "-", ret).replace("日", "")
        time_data = datetime.strptime(data, "%Y-%m-%d %H:%M:%S")
        print(time_data, type(time_data))
        return time_data
    else:
        time_list = []
        urls = ("https://jieqi.51240.com/%d_lichun__jieqi/" % year for year in range(
            start_year, start_year + limit))
        for url in urls:
            response = requests.get(url=url, headers=headers)
            html = etree.HTML(response.text)
            ret = html.xpath('//div[@class="jieqi_neirong_biaoti_beizhu"]/strong/text()')[0]
            data = re.sub(r"[年月]", "-", ret).replace("日", "")
            time_data = datetime.strptime(data, "%Y-%m-%d %H:%M:%S")
            print(time_data, type(time_data))
            time_list.append(time_data)
        time_gen = iter(time_list)
        year_gen = range(start_year, start_year + limit)
        return year_gen, time_gen

if __name__ == '__main__':
    to_ganzhi(2013, 12, 2, 23, 11, 10)  # 示例

猜你喜欢

转载自blog.csdn.net/weixin_42620314/article/details/83515688