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

如何平滑含1440个数据点的Spotify播放时长曲线图?

解决方案

一、高效平滑曲线(替代插值)

针对1440个分钟级数据,直接用pandas内置的矢量化平滑方法,速度比插值快几个数量级,同时能有效过滤异常值带来的波动:

1. 先过滤极端异常值(可选但推荐)

先通过四分位距(IQR)剔除明显的异常值,避免平滑时被干扰:

# 假设播放时长列名为play_duration
q1 = df['play_duration'].quantile(0.25)
q3 = df['play_duration'].quantile(0.75)
iqr = q3 - q1
# 保留在合理范围内的数据
df_clean = df[(df['play_duration'] >= q1 - 1.5*iqr) & (df['play_duration'] <= q3 + 1.5*iqr)]

2. 移动平均平滑

用滚动窗口均值做平滑,窗口大小可根据需求调整(比如15代表前后7分钟+当前分钟,平衡平滑度和细节):

# center=True让窗口以当前点为中心,min_periods=1避免边缘数据缺失
df_clean['smooth_rolling'] = df_clean['play_duration'].rolling(
    window=15, center=True, min_periods=1
).mean()

3. 指数加权移动平均(EWMA)

如果想更侧重近期数据的趋势,用EWMA,效率同样极高:

# span=10代表加权时侧重最近10个数据点,adjust=False保持权重一致
df_clean['smooth_ewm'] = df_clean['play_duration'].ewm(span=10, adjust=False).mean()

二、无需指定日期处理时间数据

把时间列转换为纯时间维度的索引,完全脱离日期约束:

方法1:转为time类型索引

如果你的时间是类似"00:00"的字符串:

# 转成datetime后提取时间部分,得到纯时分格式的索引
df['time'] = pd.to_datetime(df['time_str'], format='%H:%M').dt.time
df.set_index('time', inplace=True)

方法2:转为Timedelta索引(更适合时间运算)

用时长表示一天内的时间,方便后续做分钟级的偏移、分组等操作:

# 转成Timedelta,比如"00:00"对应0天0时0分
df['time_delta'] = pd.to_timedelta(df['time_str'])
df.set_index('time_delta', inplace=True)

之后所有的平滑、绘图操作都只针对一天内的分钟维度,完全不需要指定日期。


内容的提问来源于stack exchange,提问作者Alberto Salazar Lloreda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:40:43