今天是小寒节气,是2020年的第一个节气。微信上关注的人民日报公众号,每个节气都会发布一些和节气相关的时间、气候、传统习俗等,这个时间具体怎么计算的呢,其实很简单。
24节气歌:
春雨惊春清谷天,夏满芒夏暑相连。
秋处露秋寒霜降,冬雪雪冬小大寒。
24节气是依照太阳在黄道上的位置来确定的,太阳在黄道上自西向东转,一个回归年转一圈。春分时的太阳黄经为0°,每走15°就是一个节气,也就是黄经为15°时的节气为清明,30°时的节气为谷雨,以此类推,345°时为惊蛰。今天小寒节气,也就是太阳走到了黄经285°。
ephem库可以提供太阳的位置,给定一个时间,可获得太阳的黄道坐标。但是有一点要注意的是,ephem库里面提供的Equatorial函数(求赤道坐标)或者Ecliptic函数(求黄道坐标)默认的epoch(历元)参数是J2000,也就是相对于UTC 2000/1/1 12:00:00时的坐标。由于岁差章动等影响,春分点在黄道上的位置在逐渐西移,而我们上面所说的24节气依照的是太阳的视黄经,因此要把epoch参数设置为所求时间,这样所求的太阳黄经才是视黄经。
具体代码如下:
from ephem import *
import math
import datetime
#24节气
jieqi=["春分","清明","谷雨","立夏","小满","芒种",
"夏至","小暑","大暑","立秋","处暑","白露",
"秋分","寒露","霜降","立冬","小雪","大雪",
"冬至","小寒","大寒","立春","雨水","惊蛰"]
#计算黄经
def ecliptic_lon(jd_utc):
s=Sun(jd_utc)#构造太阳
equ=Equatorial(s.ra,s.dec,epoch=jd_utc)#求太阳的视赤经视赤纬(epoch设为所求时间就是视赤经视赤纬)
e=Ecliptic(equ)#赤经赤纬转到黄经黄纬
return e.lon#返回黄纬
#根据时间求太阳黄经,计算到了第几个节气,春分序号为0
def sta(jd):
e=ecliptic_lon(jd)
n=int(e*180.0/math.pi/15)
return n
#根据当前时间,求下个节气的发生时间
def iteration(jd,sta):#jd:要求的开始时间,sta:不同的状态函数
s1=sta(jd)#初始状态(太阳处于什么位置)
s0=s1
dt=1.0#初始时间改变量设为1天
while True:
jd+=dt
s=sta(jd)
if s0!=s:
s0=s
dt=-dt/2#使时间改变量折半减小
if abs(dt)<0.0000001 and s!=s1:
break
return jd
def jq(num):#从当前时间开始连续输出未来n个节气的时间
jd=now()#获取当前时间的一个儒略日和1899/12/31 12:00:00儒略日的差值
e=ecliptic_lon(jd)
n=int(e*180.0/math.pi/15)+1
for i in range(num):
if n>=24:
n-=24
jd=iteration(jd,sta)
d=Date(jd+1/3).tuple()
print("{0}-{1:02d}-{2:02d} {3}:{4:02d}:{5:02d}:{6:03.1f}".format(d[0], d[1], d[2],jieqi[n],d[3], d[4], d[5]))
n+=1
jq(36)
结果如下:
2020-10-23 霜降:06:59:26.0
2020-11-07 立冬:07:13:48.5
2020-11-22 小雪:04:39:36.0
2020-12-07 大雪:00:09:20.6
2020-12-21 冬至:18:02:9.0
2021-01-05 小寒:11:23:14.1
2021-01-20 大寒:04:39:39.9
2021-02-03 立春:22:58:36.7
2021-02-18 雨水:18:43:48.7
2021-03-05 惊蛰:16:53:33.2
2021-03-20 春分:17:37:22.4
2021-04-04 清明:21:35:3.0
2021-04-20 谷雨:04:33:21.9
2021-05-05 立夏:14:47:11.9
2021-05-21 小满:03:37:9.3
2021-06-05 芒种:18:52:9.7
2021-06-21 夏至:11:32:14.9
2021-07-07 小暑:05:05:32.6
2021-07-22 大暑:22:26:30.8
2021-08-07 立秋:14:54:1.5
2021-08-23 处暑:05:35:1.0
2021-09-07 白露:17:52:55.9
2021-09-23 秋分:03:21:3.0
2021-10-08 寒露:09:38:57.6
2021-10-23 霜降:12:51:2.5
2021-11-07 立冬:12:58:36.3
2021-11-22 小雪:10:33:31.5
2021-12-07 大雪:05:56:51.7
2021-12-21 冬至:23:59:5.4
2022-01-05 小寒:17:13:50.2
2022-01-20 大寒:10:38:52.8
2022-02-04 立春:04:50:34.8
2022-02-19 雨水:00:42:51.1
2022-03-05 惊蛰:22:43:37.3
2022-03-20 春分:23:33:18.3
2022-04-05 清明:03:20:9.6
和紫金山天文台公布的24节气时间误差基本上在10s以内,可能和ephem库的精度还不足够高有关吧。除非遇到的所求节气时间在一天的最后或者最前的几秒,否则上面的代码求得的24节气的日期一般情况下应该会和官方相同。
参考:利用PyEphem库进行任意日期的公历转换农历
2020年二十四节气精确时间 - 有趣天文奇观
2021年二十四节气精确时间 - 有趣天文奇观