Python实现日间正态分布函数:基于时间输入的数值返回方案问询
实现基于时间的日间分布数值函数
嘿,这个需求很明确,咱们一步步来搞定:
第一步:预处理你的数据点
首先得把手里的时间-数值数据对转换成可用于拟合的数值格式:
- 把每个时间点(比如
datetime.time对象)转换成当天的连续小时数,比如9:30就是9.5,14:15就是14.25,计算方式是:hour + minute/60 + second/3600 - 整理成两个列表:
x(转换后的小时数值)和y(对应的日间分布数值)
第二步:选择并拟合合适的曲线
根据你手上的图像形状,选对应的拟合方式:
情况1:单峰/平滑曲线(比如类似正弦、高斯分布)
如果曲线是平滑的单峰形状,用参数拟合更合适,比如高斯函数或者自定义的三角函数。用scipy.optimize.curve_fit来拟合参数:
from scipy.optimize import curve_fit import numpy as np import datetime # 定义拟合函数,这里以高斯函数为例 def gaussian(x, amp, mean, std): return amp * np.exp(-((x - mean)**2)/(2*std**2)) # 假设你的数据点(替换成你实际的数据集) x_data = [8, 12, 16, 20] # 转换后的小时数 y_data = [0.2, 0.8, 0.7, 0.1] # 对应的分布数值 # 拟合得到参数 params, _ = curve_fit(gaussian, x_data, y_data) amp, mean, std = params
情况2:复杂/分段曲线
如果曲线形状不规则(比如多峰、分段变化),用样条插值更灵活,用scipy.interpolate.interp1d:
from scipy.interpolate import interp1d import numpy as np # 创建插值函数,kind可选'linear'/'quadratic'/'cubic',根据曲线平滑度选择 interp_func = interp1d(x_data, y_data, kind='quadratic', fill_value="extrapolate")
第三步:封装成接收time对象的函数
把上面的拟合/插值逻辑封装成函数,输入datetime.time对象,输出分布数值:
# 基于高斯拟合的示例函数 def get_daytime_value(time_obj): # 把time对象转换成连续小时数 hour_float = time_obj.hour + time_obj.minute/60 + time_obj.second/3600 # 用拟合好的函数计算数值 return float(gaussian(hour_float, amp, mean, std)) # 基于样条插值的示例函数 def get_daytime_value(time_obj): hour_float = time_obj.hour + time_obj.minute/60 + time_obj.second/3600 return float(interp_func(hour_float).item())
额外提示
- 如果你的数据点覆盖不够全(比如缺凌晨时段),可以用
fill_value参数设置插值的外推方式,或者手动补充边界数据 - 测试的时候可以用
datetime.time(12, 30)这样的对象传入函数,验证结果是否符合你的曲线预期 - 如果需要更高精度,可以把时间转换成分钟数甚至秒数来拟合,原理是完全一致的
内容的提问来源于stack exchange,提问作者may
相关产品推荐
相关产品推荐

