当前位置: 首页 > news >正文

Python实战:天干地支与五行阴阳的自动化转换工具

1. 为什么需要天干地支转换工具

第一次接触天干地支是在研究传统节气时。当时需要将现代日期转换为农历干支纪年,手动查表不仅效率低下,还容易出错。比如2023年9月17日对应的干支是什么?阴阳属性如何?五行分布怎样?这些问题用Python可以轻松解决。

天干地支系统由10天干(甲、乙、丙...癸)和12地支(子、丑、寅...亥)组成,60年一个循环。每个干支组合都有对应的五行属性(金木水火土)和阴阳分类。这套系统在中医、风水、命理等领域广泛应用,但现代人很少能快速心算转换。

用Python实现自动化转换有三大优势:

  • 准确性:避免人工查表的笔误
  • 效率:毫秒级完成复杂计算
  • 扩展性:可集成到其他系统(如日历应用)

我曾帮一个中医诊所开发过类似工具,他们需要根据患者出生时间分析体质特征。原始方法是翻查厚厚的万年历,现在只需输入日期就能立即获取全部干支五行数据。

2. 核心算法原理解析

2.1 天干地支的数学规律

天干地支转换本质是模运算问题。观察这段代码:

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

年干支计算有个固定偏移量:公元4年正好是甲子年。所以计算2023年的干支:

yt = (_Y - 3) % 10 - 1 # 年天干索引 → 癸 yd = (_Y - 3) % 12 - 1 # 年地支索引 → 卯

这就解释了为什么代码中要减3。实际测试时发现,如果直接用年份模60,结果会偏差1-2个位置,这是干支纪年从立春开始的特性导致的。

2.2 五行的分配规则

五行分配看似复杂,其实有固定对应关系:

天干
五行

地支的五行稍复杂,因为包含藏干。比如寅是阳木,但藏有甲木、丙火、戊土。代码中做了简化处理:

dzwxs = ['水', '土', '木', '木', '土', '火', '火', '土', '金', '金', '土', '水']

2.3 阴阳判定技巧

阴阳按奇偶划分非常巧妙:

yys = {0: '阳', 1: '阴'} tgys = {"甲": 3, "乙": 5, "丙": 7, "丁": 9, "戊": 1, "己": 3, "庚": 5, "辛": 7, "壬": 9, "癸": 1}

天干的阴阳由其对应数字的奇偶决定。比如甲=3(奇→阳),乙=5(奇→阳),这与传统说法"甲阳乙阴"看似矛盾。实际上代码用(y%2)判断,而甲在列表索引0位置,0%2=0→阳,乙索引1→1%2=1→阴。

3. 完整实现与优化

3.1 日期处理模块

原始代码直接解析字符串日期,实际项目建议用datetime标准化:

from datetime import datetime def parse_date(date_str): try: return datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S") except ValueError: try: return datetime.strptime(date_str, "%Y-%m-%d") except: raise ValueError("日期格式应为YYYY-MM-DD或YYYY-MM-DD HH:MM:SS")

这样能兼容更多日期格式,且自动验证日期合法性。比如检测2月30日这种非法日期。

3.2 时辰计算优化

原代码中时辰计算:

hd = (_H+1)//2%12 if _H%2 else _H//2

这实际上是将24小时制转换为12时辰:

  • 23:00-0:59 → 子时
  • 1:00-2:59 → 丑时
  • ...
  • 21:00-22:59 → 亥时

更直观的写法:

hour_zodiac = ((hour + 1) % 24) // 2

3.3 结果可视化输出

原始输出是纯文本,可以改进为表格形式:

from tabulate import tabulate def print_result(result): headers = ["年柱", "月柱", "日柱", "时柱"] data = [ [result['干支'][:2], result['阴阳'][:2], result['五行'][:2]], [result['干支'][2:4], result['阴阳'][2:4], result['五行'][2:4]], [result['干支'][4:6], result['阴阳'][4:6], result['五行'][4:6]], [result['干支'][6:8], result['阴阳'][6:8], result['五行'][6:8]] ] print(tabulate(data, headers=headers, tablefmt="grid"))

输出效果:

+--------+--------+--------+ | 年柱 | 月柱 | 日柱 | +========+========+========+ | 癸卯 | 壬戌 | 戊寅 | | 阴阴 | 阳阳 | 阳阳 | | 水木 | 水土 | 土木 | +--------+--------+--------+

4. 实际应用案例

4.1 八字排盘系统

将这个模块扩展为完整的八字排盘工具:

class BaZiCalculator: def __init__(self, birth_datetime): self.birth = parse_date(birth_datetime) self.solar_terms = self._load_solar_terms() def get_bazi(self): base = get_tgdz(self.birth.strftime("%Y-%m-%d %H:%M:%S")) # 添加大运流年计算 return { '八字': base['干支'], '阴阳': base['阴阳'], '五行': base['五行'], '十神': self._get_ten_gods(base['干支']) }

十神是根据日干与其他干支的关系确定的,比如日干是甲:

  • 比肩:甲
  • 劫财:乙
  • 食神:丙
  • 伤官:丁
  • ...

4.2 中医体质分析

某中医项目用五行数据做体质分析:

def analyze_constitution(wuxing_str): counter = {'木':0, '火':0, '土':0, '金':0, '水':0} for w in wuxing_str: counter[w] += 1 if max(counter.values()) - min(counter.values()) > 3: return "五行严重失衡" elif counter['木'] > 3: return "肝气旺盛" elif counter['金'] < 1: return "肺气不足" else: return "五行相对平衡"

实际使用中发现,单纯看五行个数不够准确,后来加入了地支藏干加权计算。

4.3 历史数据分析

分析1900-2023年的五行分布趋势:

import matplotlib.pyplot as plt years = range(1900, 2024) wood_counts = [get_tgdz(f"{y}-01-01")['五行'].count('木') for y in years] plt.plot(years, wood_counts) plt.title("木属性年份分布") plt.show()

发现每12年会出现一次木属性高峰,这与地支寅、卯年对应的木属性一致。这种分析可用于研究传统文化中的周期理论。

http://www.jsqmd.com/news/602138/

相关文章:

  • Windows 11系统优化:基于Win11Debloat的深度性能调优与隐私保护方案
  • 告别手动造数据!用JMeter JSR223预处理程序+Groovy脚本,5分钟搞定接口签名和AES加密
  • 高效极简专业:LazyVim开源工具的个性化配置与效率提升指南
  • 图像质量评价新思路:CLIP如何理解‘好看’与‘不好看’(含实验对比)
  • 3大维度解析PeaZip:这款开源压缩神器如何重构你的文件管理体验
  • 我有3张1000元的京东e卡,想1天内变现,哪个平台回收快? - 京顺回收
  • C++类与对象(2)—构造函数析构函数
  • 批量链接管理:3秒处理100个链接的开源效率工具
  • Cursor Pro激活完全指南:三步解锁无限AI编程能力的实用技巧
  • 还在为黑苹果配置发愁?试试这个智能EFI生成工具,四步搞定复杂设置
  • 打破窗口尺寸限制:SRWE让你的应用程序随心所欲变换大小 [特殊字符]
  • ai辅助can网络设计:让快马平台智能生成dbc定义与通信代码
  • 国家中小学智慧教育平台电子课本下载工具:一键获取教材PDF的终极解决方案
  • 终极指南:如何快速构建ARM TrustZone可信执行环境
  • 揭开跨国婚恋的幻象:中国女性远嫁非洲悲剧背后的深层叩问
  • 3步搞定智能字幕下载:GetSubtitles让观影体验再升级
  • 零基础入门AI智能体开发:在快马平台亲手打造天气查询skill
  • 揭秘真实世界电动汽车电池性能:20辆车29个月充电数据分析完整指南 [特殊字符]⚡
  • 面试官问排序算法?别慌,用仓颉代码和动图一次讲清冒泡、选择、插入排序
  • 如何用GetQzonehistory永久保存你的QQ空间记忆
  • 一键部署音文对齐模型:Qwen3-ForcedAligner镜像使用详解
  • 重新定义网页资源获取:猫抓如何重塑你的数字内容管理方式
  • VeraGrid:电力系统数字孪生的开源解决方案,让电网仿真变得简单
  • 3大突破:MusicFreePlugins的插件化音乐聚合解决方案
  • OpenMMD:零门槛3D动作捕捉神器,让真人视频秒变动画
  • 别再只把DeepSeek当聊天机器人了!这5个隐藏功能,让你工作效率翻倍
  • Guohua Diffusion 跨平台开发:使用IDEA进行模型服务端与Android端集成开发
  • 效率提升:快马ai一键生成高性能python爱心动画代码,节省开发时间
  • 黑丝空姐-造相Z-Turbo零基础教学:从环境搭建到图片生成
  • OpenClaw监控告警:Gemma-3-12b-it分析服务器日志并推送异常