以文本方式查看主题

-  中华农历论坛  (http://bbs.nongli.net/index.asp)
--  历法知识  (http://bbs.nongli.net/list.asp?boardid=2)
----  [原创] Python历算函数库及工作流软件简介  (http://bbs.nongli.net/dispbbs.asp?boardid=2&id=87769)

--  作者:veteranhit
--  发布时间:2021/10/10 14:53:00
--  [原创] Python历算函数库及工作流软件简介
给大家介绍一个机器学习的免费开源工具KNIME(注:当然它也可以用于数据处理,进行历法计算),以及计算传统历法信息的python函数库sxtwl, sxtwl几乎是一个全能的公历与农历互相转换的模块,并且提供了天干地支、二十四节气等实用信息。

随着python等高级程序语言的出现,软件开发模式也在发生变化。以往功能性开发的代码,只能完成特定需求,千人千面,不容易被修改、维护、分享、组织,形成的工具是平台性工具,只能按照特定功能进行使用,类似于微软开发windows操作系统的模式;而今,为了完成解耦、封装、复用、协同,出现了类似谷歌的模式,底层代码被高度封装,形成一些库,组成生态,供开发者灵活地组织和调用,干预和调整,完成复杂的需求。关于历法方面的计算,也希望有识之士能够开发功能更为完备的函数库,以飨更多历法爱好者。这里笔者发现了一个python库sxtwl,实际使用之后发现效果还可以,所以把这个信息跟大家分享一下。

在python命令模式下安装sxtwl模块:pip install sxtwl,然后就可以使用模块当中的函数,比如:
import sxtwl
lunar = sxtwl.Lunar()
daylunar = lunar.getDayBySolar(年,月,日)
就可以获取公历日期对应的农历对象,该对象内包含了农历日期的各种信息,可以方便地为各种需求服务(注:具体使用方法可以百度)。

为什么要使用KNIME呢,因为KNIME是工作流模式,将大量数据处理封装在可视化节点当中,通过连接节点,形成工作流来处理数据,这样就完成了数据处理过程的固化,处理效率非常高。对于新的分析需求,可以快速地通过各类节点,包括python脚本节点的组织和链接加以解决。

举一个例子,笔者在十多年前曾经使用matlab写过算法,可以计算各类农历信息,包括朔望,节气,月份等等。但这些结果由复杂的公式和理论来呈现,并不能让人们对里面所蕴含的规律产生更加直观的感受,只是获取一个结果,看不到全局,可能并不是我们历法爱好者所追求的。所以做了大量的工作,将计算结果加以整理,汇总,简化,最后达到只使用少量的诗歌,指算,加减法,求余(注:不包括乘除,取整,不需要纸笔)心算就可以快速得到各类历算信息,比如星期计算、农历计算、八字计算(注:由于是心算法,节气只能精确到正负一刻钟),记忆量很小,特别适合大众掌握。虽然随着时代的发展,这样的方法可能实用价值降低了,但不影响通过这些规律的总结来让我们感受天体运行,历法设计中所蕴含的规律之美。后来,这样的代码遗失了,只留下了那些总结出来的只言片语,现在回头去看,也不能完全理解了。这就是一个零星的需求,最好能有一种高效,便捷的方式,帮助我回忆那些诗歌,指算法的含义。

有了工作流方式,这一切就变得非常简单。比如通过一个日期节点,就可以方便地生成一个时间序列,间隔可以任意设置,然后通过一些功能节点,提取时间序列里面的各种信息,再通过python脚本节点调用sxtwl库,获取农历对象,并且提取该对象中的各种属性,完成农历信息的批量获取。最后,通过KNIME自带的各种信息处理节点,完成各类信息的汇总,分析,组织,并且加以输出,这样再与之前的心算法内容对比,就可以回忆起算法内容的内涵,这样的需求就可以快速加以解决。

比如关于闰月,通过指算,可以知道1966年,大概闰二月,但通过工作流计算结果里发现是闰三月,这样就回忆起一句口诀“陆路骑士时而试试散酒”,从而知道“陆路”中的1966年,闰月需要加一,也就是从闰二月变为闰三月。虽然这样的闰月分布规律不是很精确,需要修正,但这种不精确的规律,就像我们将地球视为纯粹球体,从而提出地圆说一样,使人们感受到了规律中蕴含的美感。至于真正的高程,可以通过其他理论描述,精确获得,二者并不是矛盾的。

综上所述,本文只是介绍了一些计算资源和工具,可以让各位历法爱好者更高效、更灵活地完成各类计算,探索其中的奥秘,希望对大家有所帮助。