如何用Python生成含日度、年度波动的逐小时温度时间序列
Python实现双正弦波叠加逐小时温度序列模拟
核心逻辑是通过两个不同周期的正弦波分别表征日尺度昼夜温差、年尺度季节温差,线性叠加后加基准温度偏移即可得到目标序列,不需要做复杂的嵌套计算。
参数设定说明
X轴取平年逐小时序号,总长度为365*24=8760个时间点,两个正弦波的参数可按需调整:
- 日波动项:周期24小时,振幅取指定值1,通过相位调整让每日最高温出现在14点、最低温出现在凌晨,符合实际昼夜温度规律
- 年波动项:周期为全年总小时数,振幅取大于日波动的值(示例取15,对应冬夏温差30℃,可根据模拟区域气候修改),相位调整为北半球1月最冷、7月最热
- 基准垂直偏移取指定值25,对应年平均温度
完整实现代码
import numpy as np import matplotlib.pyplot as plt # 1. 生成X轴:年内逐小时序号(平年共8760小时) hour_seq = np.arange(0, 365 * 24, 1) # 2. 定义波动参数 base_temp = 25 # 基准温度,即指定的vertical_shift # 日尺度昼夜波动参数 day_amplitude = 1 day_period = 24 day_phase = -np.pi / 2 # 相位校准:对齐每日高低温出现时间 # 年尺度季节波动参数 year_amplitude = 15 # 季节波动振幅,可按需调整,数值越大冬夏温差越大 year_period = 365 * 24 year_phase = -np.pi / 2 + (31 * 24 * 2 * np.pi) / year_period # 相位校准:对齐冬夏高低温出现时间 # 3. 分别计算两个尺度的波动分量 day_wave = day_amplitude * np.sin(2 * np.pi * hour_seq / day_period + day_phase) year_wave = year_amplitude * np.sin(2 * np.pi * hour_seq / year_period + year_phase) # 4. 叠加得到最终逐小时温度序列 temp_series = base_temp + year_wave + day_wave # 可选:可视化验证结果 plt.figure(figsize=(12, 5)) plt.plot(hour_seq, temp_series, linewidth=0.5) plt.xlabel('年内逐小时序号') plt.ylabel('温度(℃)') plt.title('双尺度叠加逐小时温度模拟结果') plt.grid(alpha=0.3) plt.show() # 截取前7天查看昼夜波动细节 plt.figure(figsize=(12, 4)) plt.plot(hour_seq[:7*24], temp_series[:7*24], marker='o', markersize=2) plt.xlabel('小时序号') plt.ylabel('温度(℃)') plt.title('前7天昼夜温度波动效果') plt.grid(alpha=0.3) plt.show()
调整注意事项
- 如果不需要对齐实际高低温出现时间,直接把两个
phase参数设为0即可,仅会改变极值点位置,不影响波动叠加的形态 - 年振幅
year_amplitude可根据模拟场景修改:模拟华南等温差小的区域可取8-10,模拟东北等温差大的区域可取18-22 - 模拟闰年时,把总小时数、年周期参数同步改为366*24=8784即可
- 若需要加入随机扰动模拟实际气温的无规律波动,可以在最终结果上叠加一个小振幅的正态分布噪声:
temp_series += np.random.normal(0, 0.3, size=len(temp_series))
内容的提问来源于stack exchange,提问作者ArieAI
相关产品推荐
相关产品推荐

