python计算出nan_如何用python计算出农历干支(干货)

在写一个python项目时,需要实现公历转换成农历,并且要实现计算出干支,实际就是农历的八字!!!

先科普一下,中国传统中的生辰八字其实就是你的农历日期的另一种表达。

举个例子:

公历日期 2019-07-16 北京时间 10:50:15

农历日期 2019年 六月 十四 10:50:15

对应八字: 己亥 辛未 甲寅 己巳

其中:

己 、亥 分别是年的干和支

辛、未 分别是月的干和支

甲、寅 分别是日的干和支

己、巳 分别是时的干和支

不得不佩服老祖宗还是很厉害的,在古代能研究出一套这么复杂的计时规则。干,又叫天干,有十个字;支,即地支有十二个字,有六十种组合,六十年一个循环,也就是常说的六十年一道轮回,终于明白咋回事了,哈哈。

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

地支:'子丑寅卯辰巳午未申酉戌亥'

其中,年干支和日的干支的计算都有比较直接的规则,但是月干支的规则真的要复杂的多,还要看节气,节气还会影响年份,例如,有些年份腊月就立春,在计算月干支时,就得依据下一年的一月份(某度:月柱的依据是干支历的干支纪月。注意月干支不是以农历每月初一为分界线,而是以二十四节气的12个主气为准,交节前为上个月,交节后为下个月。)平时月份的计算也得考虑节气,从立春到惊蛰是一月,从惊蛰到清明是二月,所以跟实际的月份没有直接关系,没有直接关系!我晕,老祖宗是怎么设计的,尤其兵荒马乱的年代能记得住么!!!

月干支与年干的对应表,注意,月份,是依据节气定的月份,不能直接用农历的月:

ae164d299958c34f9ac649982fedc8bf.png
月干支与年干的对应表

当然,谈到了八字,就不得不提生辰五行,所以,还顺带实现了八字时辰五行的统计。

废话不说了,直接上干货吧:(也可以到我的github上下载)

HiGavin/Lunar​github.com
7964fa2d4506b566968c056a0a7699c3.png
class Lunar(object):
    # ******************************************************************************
    # 下面为阴历计算所需的数据,为节省存储空间,所以采用下面比较变态的存储方法.
    # ******************************************************************************
    # 数组g_lunar_month_day存入阴历1901年到2050年每年中的月天数信息,
    # 阴历每月只能是29或30天,一年用12(或13)个二进制位表示,对应位为1表30天,否则为29天
    g_lunar_month_day = [
        0x4ae0, 0xa570, 0x5268, 0xd260, 0xd950, 0x6aa8, 0x56a0, 0x9ad0, 0x4ae8, 0x4ae0,  # 1910
        0xa4d8, 0xa4d0, 0xd250, 0xd548, 0xb550, 0x56a0, 0x96d0, 0x95b0, 0x49b8, 0x49b0,  # 1920
        0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada8, 0x2b60, 0x9570, 0x4978, 0x4970, 0x64b0,  # 1930
        0xd4a0, 0xea50, 0x6d48, 0x5ad0, 0x2b60, 0x9370, 0x92e0, 0xc968, 0xc950, 0xd4a0,  # 1940
        0xda50, 0xb550, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, 0xb4a8, 0x6ca0,  # 1950
        0xb550, 0x55a8, 0x4da0, 0xa5b0, 0x52b8, 0x52b0, 0xa950, 0xe950, 0x6aa0, 0xad50,  # 1960
        0xab50, 0x4b60, 0xa570, 0xa570, 0x5260, 0xe930, 0xd950, 0x5aa8, 0x56a0, 0x96d0,  # 1970
        0x4ae8, 0x4ad0, 0xa4d0, 0xd268, 0xd250, 0xd528, 0xb540, 0xb6a0, 0x96d0, 0x95b0,  # 1980
        0x49b0, 0xa4b8, 0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada0, 0xab60, 0x9370, 0x4978,  # 1990
        0x4970, 0x64b0, 0x6a50, 0xea50, 0x6b28, 0x5ac0, 0xab60, 0x9368, 0x92e0, 0xc960,  # 2000
        0xd4a8, 0xd4a0, 0xda50, 0x5aa8, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950,  # 2010
        0xb4a0, 0xb550, 0xb550, 0x55a8, 0x4ba0, 0xa5b0, 0x52b8, 0x52b0, 0xa930, 0x74a8,  # 2020
        0x6aa0, 0xad50, 0x4da8, 0x4b60, 0x9570, 0xa4e0, 0xd260, 0xe930, 0xd530, 0x5aa0,  # 2030
        0x6b50, 0x96d0, 0x4ae8, 0x4ad0, 0xa4d0, 0xd258, 0xd250, 0xd520, 0xdaa0, 0xb5a0,  # 2040
        0x56d0, 0x4ad8, 0x49b0, 0xa4b8, 0xa4b0, 0xaa50, 0xb528, 0x6d20, 0xada0, 0x55b0,  # 2050
    ]

    # 数组gLanarMonth存放阴历1901年到2050年闰月的月份,如没有则为0,每字节存两年
    g_lunar_month = [
        0x00, 0x50, 0x04, 0x00, 0x20,  # 1910
        0x60, 0x05, 0x00, 0x20, 0x70,  # 1920
        0x05, 0x00, 0x40, 0x02, 0x06,  # 1930
        0x00, 0x50, 0x03, 0x07, 0x00,  # 1940
        0x60, 0x04, 0x00, 0x20, 0x70,  # 1950
        0x05, 0x00, 0x30, 0x80, 0x06,  # 1960
        0x00, 0x40, 0x03, 0x07, 0x00,  # 1970
        0x50, 0x04, 0x08, 0x00, 0x60,  # 1980
        0x04, 0x0a, 0x00, 0x60, 0x05,  # 1990
        0x00, 0x30, 0x80, 0x05, 0x00,  # 2000
        0x40, 0x02, 0x07, 0x00, 0x50,  # 2010
        0x04, 0x09, 0x00, 0x60, 0x04,  # 2020
        0x00, 0x20, 0x60, 0x05,
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值