文章目录
- 项目说明
- 关于人体生物节律
- 用到的技术
- 代码实现
- 获取每月有多少天
- 计算每天到生日过了多少天
- 计算节律
- 绘图
- 结果
项目说明
这里仿照 http://www.4qx.net/The_Human_Body_Clock.php 做一个人体生物节律的计算和展示
关于人体生物节律
- 百度/维基百科 解释
https://zh.wikipedia.org/wiki/生理节律
https://baike.baidu.com/item/人体生物节律/9883446
基本生物节律
情绪(28天)
影响:情绪、灵敏度、创造力
体力(23天)
影响:力量、韧性、耐久力、协调性
智力(33天)
影响:分析思考、逻辑、学习能力、记忆力
次级生物节律
精神(53天)
直觉(38天)
意识(48天)
美感(43天)
用到的技术
- 计算日期间隔
- 图表展示,使用 pyecharts;
https://echarts.apache.org/zh/index.html
https://github.com/pyecharts/pyecharts
https://github.com/pyecharts/pyecharts-gallery
代码实现
获取每月有多少天
import time
import datetime
import os
def get_days_4month(y, m):
if m < 1 and m > 12: # 保证用户输入月份是在1-12月份
print('输入日期错误')
return 0
t = 0 # t 变量用于表示闰年和平年的标志位
list_maxm = [1, 3, 5, 7, 8, 10, 12] # 创建大月的列表
list_litem = [4, 6, 9, 11] # 创建小月的列表
if y % 4 == 0 and y % 100 != 0 or y % 400 == 0:
t = 1
if m in list_maxm:
d = 31 # 计算大月的天数
elif m == 2 and t == 0:
d = 28 # 计算平年中2月的天数
elif m == 2 and t == 1:
d = 29 # 计算闰年中2月的天数
elif m in list_litem:
d = 30 # 计算小月的天数
return d
计算每天到生日过了多少天
format = '%Y-%m-%d'
# 2023-02-12
def get_gap(birthday, day):
d1 = datetime.datetime.strptime(birthday , format)
d2 = datetime.datetime.strptime(day , format)
diff = d2 - d1
# print(diff.days)
return diff.days
计算节律
TL_DUR = 23
QX_DUR = 28
ZL_DUR = 33
def get_rhythm(gap):
tl_circle = int(gap / TL_DUR)
tl_day = gap % TL_DUR
qx_circle = int(gap / QX_DUR)
qx_day = gap % QX_DUR
zl_circle = int(gap / ZL_DUR)
zl_day = gap % ZL_DUR
# print(tl_circle, tl_day, qx_circle, qx_day, zl_circle, zl_day)
return tl_circle, tl_day, qx_circle, qx_day, zl_circle, zl_day
绘图
from pyecharts.charts import Line
import pyecharts.options as opts
from pyecharts.faker import Faker
import webbrowser
import math
def get_gap_rate(gap_day, dur):
rate = math.sin(math.pi * 2 * float(gap_day)/dur)
# return round(rate, 5)
return rate
def get_month_rhythm(year, month):
days = get_days_4month(year, month)
print('-- days : ', days)
birthday = '1991-08-26'
tl_arr = []
qx_arr = []
zl_arr = []
day_arr = []
for i in range(days):
# day = '{%d}-{%02d}-{%02d}'.format(year, month, i+1)
day = '%d-%02d-%02d'%(year, month, i+1)
gap = get_gap(birthday, day)
print('-- ', day, gap)
tl_circle, tl_day, qx_circle, qx_day, zl_circle, zl_day = get_rhythm(gap)
# tl_arr.append(tl_day)
# qx_arr.append(qx_day)
# zl_arr.append(zl_day)
day_arr.append(str(i+1))
tl_arr.append(get_gap_rate(tl_day, TL_DUR))
qx_arr.append(get_gap_rate(qx_day, QX_DUR))
zl_arr.append(get_gap_rate(zl_day, ZL_DUR))
line4=(
Line()
.add_xaxis(day_arr)
.add_yaxis('体力', tl_arr, is_smooth=True, is_symbol_show=False)
.add_yaxis('情绪', qx_arr, is_smooth=True, is_symbol_show=False)
.add_yaxis('智力', zl_arr, is_smooth=True, is_symbol_show=False)
.set_global_opts(title_opts=opts.TitleOpts(title=f'人体生物节律 {year}年{month}月\n生日:{birthday}'))
)
file_path = 'rhythm.html'
line4.render(file_path)
webbrowser.open("file://" + os.path.realpath(file_path))
year, month = 2023, 2
get_month_rhythm(year, month)
结果
是不是和该网站的效果比较接近呢?
伊织 2023-02-20(一)