Python编写完整动态二十四个节气的代码和注释
一段代码,输出的结果为一个节气
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
#从当前时间开始连续输出未来n个节气的时间
def jq(num):
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
if __name__=="__main__”:
jq(24)
是要动态计算每一年的二十四个节气的日期?输入是什么?
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)
请看:https://zhuanlan.zhihu.com/p/101273758?utm_id=0
# ephem库计算,使用二分法迭代函数
from ephem import *
import math
import datetime
from skyfield.api import load
planets = load('de422.bsp')
tropicl_year=365.24219647#回归年长度
ts = load.timescale()
earth = planets[399]
#24节气
jieqi=["春分","清明","谷雨","立夏","小满","芒种",\
"夏至","小暑","大暑","立秋","处暑","白露",\
"秋分","寒露","霜降","立冬","小雪","大雪",\
"冬至","小寒","大寒","立春","雨水","惊蛰"]
#计算黄经
def ecliptic_lon(jd):
#sun = planets['SUN']
#astrometric = earth.at(jd).observe(sun)
#apparent = astrometric.apparent()
lat, lon, distance = earth.at(jd).observe(planets['SUN']).apparent().ecliptic_latlon(epoch='date')
#lat, lon, distance = apparent.ecliptic_latlon(epoch='date')#求太阳的视黄经经视黄纬和距离(epoch设为所求时间就是视赤经视赤纬)
#p=earth.at(jd).observe(planets['SUN']).astrometric.apparent().ecliptic_latlon(epoch='date')
#lon=p[0]
return lon._degrees*math.pi/180.0#返回黄纬
#根据时间求太阳黄经,计算到了第几个节气,春分序号为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
e=ecliptic_lon(jd)
#dt=((s1+1)*15.0-e*180.0/math.pi)/360.0*tropicl_year#初始时间改变量设为当前太阳黄经和下个节气点黄经相差度数换算为的天数
dt=14#如果不是14天,下面有可能出现连续加两个14天,导致跳过了一个节气
#print(s1," ",dt," ",e*180.0/math.pi)
while True:
jd=ts.tai_jd(jd.tai+dt)
#jd+=dt
s=sta(jd)
if s0!=s:
s0=s
dt=-dt/2#使时间改变量折半减小
if abs(dt)<0.000001 and s!=s1:#s!=s1是为了使时间跨到下个节气时间之后,方便接下来节气的计算,skyfield时间精度是微秒
break
return jd
def jq(num):#从当前时间开始连续输出未来n个节气的时间
#jd=now()#获取当前时间的一个儒略日和1899/12/31 12:00:00儒略日的差值
t = ts.now()
#t= ts.tt(1501, 1, 1, 12, 0,0)
e=ecliptic_lon(t)
n=int(e*180.0/math.pi/15)+1
print(' 年 -月-日 节气:时:分:秒')
for i in range(num):
if n>=24:
n-=24
t=iteration(t,sta)
e=ecliptic_lon(t)
#e=ecliptic_lon(t)
#d=Date(jd+1/3).tuple()
t1=ts.tai_jd(t.tai+1/3)
#print("{0}-{1:02d}-{2:02d} {3}:{4:02d}:{5:02d}:{6:02d}.{7:02d}".format(t1.utc.year, t1.utc.month, t1.utc.day,jieqi[n],#存在截断误差
# t1.utc.hour,t1.utc.minute, int(t1.utc.second),int(100*(t1.utc.second-int(t1.utc.second)))))
print("{0}-{1:02d}-{2:02d} {3}:{4:02d}:{5:02d}:{6:03.1f}".format(t1.utc.year, t1.utc.month, t1.utc.day,jieqi[n],t1.utc.hour,t1.utc.minute, t1.utc.second))#秒数可能会出现60
n+=1
jq(24)
计算节气和计算春节等动态日期是一样的,以某一个固定时间点开始,处理好瑞年、瑞月,方法都差不多,参考:https://zhuanlan.zhihu.com/p/101273758?utm_id=0
直接爬气象的信息就可以,这个实际的应用目的是什么呢?按照题目的连接https://article.itxueyuan.com/LgAjj3
import turtle # 导入turtle库(模块)
turtle.bgcolor("#ffff55") # 设置背景颜色为#ffff55,一种浅黄色
turtle.speed(0) # 设置海龟的绘图速度,参数为0时最快
turtle.delay(0) # 设置海龟绘图的延迟时间,参数为0时,表示绘图没有延迟
### ② 变量初始化设置
# 创建列表name,存放24节气中文名称
name=["雨水","惊蛰","春风",
"清明","谷雨","立夏",
"小满","芒种","夏至",
"小暑","大暑","立秋",
"处暑","白露","秋风",
"寒露","霜降","立冬",
"小雪","大雪","冬至",
"小寒","大寒","立春"]
# 创建列表en_name,存放24节气英文名称
en_name=["Rain Water","Awakening of Insects","Spring Equinox",
"Pure Brightness","Grain Rain","Beginning of Summer",
"Grain Buds","Grain in Ear","Summer Solstice",
"Minor Heat","Major Heat","Beginning of Autumn",
"End of Heat","White Dew","Autumn Equinox",
"Cold Dew","Frost's Descent","Beginning of Winter",
"Minor Snow","Major Snow","Winter Solstice",
"Minor Cold","Major Cold","Beginning of Spring"]
# 创建列表poem,存放诗词
# 没有对应的诗词,就定义为空字符串。如果不定义,调用时会报错
poem=["随风潜入夜 润物细无声","春雷响 万物长","春风如贵客 一到便繁华",
"清明时节雨纷纷","风吹雨洗一城花","天地始交 万物并秀",
"物至于此 小得盈满","家家麦饭美 处处菱歌长","绿筠尚含粉 圆荷始散芳",
"荷风送香气 竹露滴清响","桂轮开子夜 萤火照空时","天阶夜色凉如水 坐看牵牛织女星",
"春种一粒粟 秋收万颗子","露从今夜白 月是故乡明","",
"","","",
"","","",
"","",""]
# 定义变量n,作为累加器
n=0
### ③ 自定义函数fun()
# fun()的功能是,写一个倒计时数字,以及一个节气的名称、英文名称和对应的诗词
def fun():
global n # 强制n是全局变量的n(即声明本函数体内的变量n为主函数中的那个全局变量n)
turtle.clear() # 清除屏幕中的已有绘图。(如果不用clear(),5个数字会重叠在一起)
turtle.dot(500,"#b1352b") # 画一个直径为500,颜色为#b1352b(一种红色)的圆点,作为背景装饰
turtle.penup() # 海龟抬脚,移动时不会留下痕迹,但是仍然可以写字,所以后面无需再写pendown()
turtle.setheading(-90) # 让海龟头部向下
turtle.backward(10) # 海龟向上移动10像素,准备写字.(如果不向上移动10像素,海龟写出的几行字会偏下)
turtle.write(24-n,align="center",font=("黑体",120)) # 写倒计时数字(第1行)
turtle.forward(50) # 海龟向下移动50像素,准备写字
turtle.write(name[n],align="center",font=("黑体",30)) # 写节气中文名称(第2行)
turtle.forward(50) # 海龟再向下移动50像素,准备写字
turtle.write(en_name[n],align="center",font=("Arial",25)) # 写节气英文名称(第3行)
turtle.forward(50) # 海龟再向下移动50像素,准备写字
turtle.write(poem[n],align="center",font=("隶书",20)) # 写节气对于诗词(第4行)
turtle.home() # 海龟返回原点,回到初始位置
n=n+1 # 累加器n加1
### ④ 主程序
# 显示两行引导文字
turtle.pencolor("black") # 设置画笔颜色为黑色black
turtle.penup() # 海龟抬脚,移动时不会留下痕迹,但是仍然可以写字,所以后面无需再写pendown()
turtle.setheading(-90) # 让海龟头部向下
turtle.backward(30) # 海龟向上移动30像素(步),准备写字.(如果不向上移动30像素,海龟写出的两行字会偏下)
turtle.write("让我们一起倒计时,迎接春的到来",align="center",font=("黑体",20)) # 写中文引导语
turtle.forward(60) # 海龟再向下移动60像素(步),准备写字
turtle.write("Let's greet the arrival of spring with a countdown",align="center",font=("Arial",20)) # 写英文引导语
turtle.home() # 海龟返回原点,回到初始位置
# 24秒倒计时开始
turtle.pencolor("white") # 设置画笔颜色为白色white
for i in range(24): # 每次调用fun()写4行文字,要循环24次
# 调用自定义函数fun()
turtle.ontimer(fun, t=1000*(i+1)) # 安装一个计时器,t毫秒后调用fun()函数
### ⑤ 海龟绘图结束,隐藏海龟
turtle.hideturtle()
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)
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 测试环境: python2.7
# 安装requests依赖 => pip install requests/ easy_install requests
# 导入requests依赖
import requests
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def apishop_send_request(method, url, params=None, headers=None):
'''''
转发请求到目的主机
@param method str 请求方法
@param url str 请求地址
@param params dict 请求参数
@param headers dict 请求头
'''
method = str.upper(method)
if method == 'POST':
return requests.post(url=url, data=params, headers=headers)
elif method == 'GET':
return requests.get(url=url, params=params, headers=headers)
else:
return None
method = "POST"
url = "https://api.apishop.net/common/jieqi/Get24Jieqi"
headers = None
params = {
}
result = apishop_send_request(method=method, url=url, params=params, headers=headers)
if result:
body = result.text
response = json.loads(body)
status_code = response["statusCode"]
if (status_code == '000000'):
# 状态码为000000, 说明请求成功
print('请求成功:%s' % (body,))
else:
# 状态码非000000, 说明请求失败
print('请求失败: %s' % (body,))
else:
# 返回内容异常,发送请求失败
print('发送请求失败')
[python] view plain copy
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 测试环境: python2.7
# 安装requests依赖 => pip install requests/ easy_install requests
# 导入requests依赖
import requests
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def apishop_send_request(method, url, params=None, headers=None):
'''''
转发请求到目的主机
@param method str 请求方法
@param url str 请求地址
@param params dict 请求参数
@param headers dict 请求头
'''
method = str.upper(method)
if method == 'POST':
return requests.post(url=url, data=params, headers=headers)
elif method == 'GET':
return requests.get(url=url, params=params, headers=headers)
else:
return None
method = "POST"
url = "https://api.apishop.net/common/jieqi/Get24Jieqi"
headers = None
params = {
}
result = apishop_send_request(method=method, url=url, params=params, headers=headers)
if result:
body = result.text
response = json.loads(body)
status_code = response["statusCode"]
if (status_code == '000000'):
# 状态码为000000, 说明请求成功
print('请求成功:%s' % (body,))
else:
# 状态码非000000, 说明请求失败
print('请求失败: %s' % (body,))
else:
# 返回内容异常,发送请求失败
print('发送请求失败')
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 测试环境: python2.7
# 安装requests依赖 => pip install requests/ easy_install requests
# 导入requests依赖
import requests
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def apishop_send_request(method, url, params=None, headers=None):
'''''
转发请求到目的主机
@param method str 请求方法
@param url str 请求地址
@param params dict 请求参数
@param headers dict 请求头
'''
method = str.upper(method)
if method == 'POST':
return requests.post(url=url, data=params, headers=headers)
elif method == 'GET':
return requests.get(url=url, params=params, headers=headers)
else:
return None
method = "POST"
url = "https://api.apishop.net/common/jieqi/GetJieqiDetail"
headers = None
params = {
"jieqiID":"" #节气ID:从查询二十四节气接口获得,如“1”
}
result = apishop_send_request(method=method, url=url, params=params, headers=headers)
if result:
body = result.text
response = json.loads(body)
status_code = response["statusCode"]
if (status_code == '000000'):
# 状态码为000000, 说明请求成功
print('请求成功:%s' % (body,))
else:
# 状态码非000000, 说明请求失败
print('请求失败: %s' % (body,))
else:
# 返回内容异常,发送请求失败
print('发送请求失败')
[python] view plain copy
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 测试环境: python2.7
# 安装requests依赖 => pip install requests/ easy_install requests
# 导入requests依赖
import requests
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def apishop_send_request(method, url, params=None, headers=None):
'''''
转发请求到目的主机
@param method str 请求方法
@param url str 请求地址
@param params dict 请求参数
@param headers dict 请求头
'''
method = str.upper(method)
if method == 'POST':
return requests.post(url=url, data=params, headers=headers)
elif method == 'GET':
return requests.get(url=url, params=params, headers=headers)
else:
return None
method = "POST"
url = "https://api.apishop.net/common/jieqi/GetJieqiDetail"
headers = None
params = {
"jieqiID":"" #节气ID:从查询二十四节气接口获得,如“1”
}
result = apishop_send_request(method=method, url=url, params=params, headers=headers)
if result:
body = result.text
response = json.loads(body)
status_code = response["statusCode"]
if (status_code == '000000'):
# 状态码为000000, 说明请求成功
print('请求成功:%s' % (body,))
else:
# 状态码非000000, 说明请求失败
print('请求失败: %s' % (body,))
else:
# 返回内容异常,发送请求失败
print('发送请求失败')
```
调用日历,哈哈哈哈哈