You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:18:14