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

Python时间序列分解报错:float()参数类型错误(非数值/字符串)

问题:调用seasonal_decompose触发TypeError:无法将Timestamp转换为float

我正在自学Python时间序列分解,处理香港政府公开的2023年1-11月西九龙高铁离港香港居民客流数据,用来可视化新冠出行限制解除后的客流趋势。完成数据清洗与子集处理后,调用seasonal_decompose函数执行时间序列分解时触发TypeError,报错提示float()参数需为字符串或数值,而非Timestamp类型。

相关代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
import seaborn as sns
from pylab import rcParams

df = pd.read_csv("https://www.immd.gov.hk/opendata/eng/transport/immigration_clearance/statistics_on_daily_passenger_traffic.csv")

# data cleaning
df = df.iloc[: , :-1]
df = df[df["Date"].str.contains("2023") == True]

from datetime import date
from datetime import datetime

df["Date"] = df["Date"].apply(lambda x: datetime.strptime(str(x), "%d-%m-%Y"))

control_point = df['Control Point'].tolist()

options = ['Airport', 'Express Rail Link West Kowloon', 'Lo Wu', 'Lok Ma Chau Spur Line', 'Heung Yuen Wai', 'Hong Kong-Zhuhai-Macao Bridge', 'Shenzhen Bay']

df_clean = df.loc[df['Control Point'].isin(options)] 

df_XRL = df[df["Control Point"].str.contains("Express Rail Link West Kowloon") & df["Arrival / Departure"].str.contains("Departure")]
df_XRL = df_XRL[["Date","Hong Kong Residents"]]
df_XRL = df_XRL[~(df_XRL['Date'] > '2023-11-30')]
df_XRL['Month'] = pd.DatetimeIndex(df_XRL['Date']).strftime("%b")
df_XRL['Week day'] = pd.DatetimeIndex(df_XRL['Date']).strftime("%a")

# Pivot table

from numpy import nan
monthOrder = ['Jan', 'Feb', 'Mar', 'Apr','May','Jun','Jul','Aug','Sep','Oct','Nov']
dayOrder = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun']

pivot_XRL = pd.pivot_table(df_XRL, index=['Month'],
                        values=['Hong Kong Residents'],
                        columns=['Week day'], aggfunc=('sum')).loc[monthOrder, (slice(None), dayOrder)]

# Time Series Decomposition - where errors occur

from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(df_XRL, model = "additive")
decomposition.plot()
plt.rcParams['axes.labelsize'] = 16
plt.rcParams['axes.titlesize'] = 16

报错信息

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_6628\3049465439.py in <module>
      1 from statsmodels.tsa.seasonal import seasonal_decompose
----> 2 decomposition = seasonal_decompose(df_XRL, model = "additive")
      3 decomposition.plot()
      4 plt.rcParams['axes.labelsize'] = 16
      5 plt.rcParams['axes.titlesize'] = 16

~\anaconda3\lib\site-packages\statsmodels\tsa\seasonal.py in seasonal_decompose(x, model, filt, period, two_sided, extrapolate_trend)
    140         pfreq = getattr(getattr(x, "index", None), "inferred_freq", None)
    141 
--> 142     x = array_like(x, "x", maxdim=2)
    143     nobs = len(x)
    144 

~\anaconda3\lib\site-packages\statsmodels\tools\validation\validation.py in array_like(obj, name, dtype, ndim, maxdim, shape, order, contiguous, optional)
    133     if optional and obj is None:
    134         return None
--> 135     arr = np.asarray(obj, dtype=dtype, order=order)
    136     if maxdim is not None:
    137         if arr.ndim > maxdim:

~\anaconda3\lib\site-packages\pandas\core\generic.py in __array__(self, dtype)
   2082     def __array__(self, dtype: npt.DTypeLike | None = None) -> np.ndarray:
   2083         values = self._values
-> 2084         arr = np.asarray(values, dtype=dtype)
   2085         if (
   2086             astype_is_view(values.dtype, arr.dtype)

TypeError: float() argument must be a string or a number, not 'Timestamp'

解决方案

核心问题

seasonal_decompose要求输入的时间序列必须是以时间列为索引的单数值列,或是一维数值数组。你传入的df_XRL包含Timestamp类型的Date列、数值列和其他分类列,函数尝试将整个DataFrame转换为数值数组时,遇到Timestamp类型就会触发转换错误。

修复步骤

  1. 将Date列设置为DataFrame的索引,确保索引为Datetime类型
  2. 仅传入客流数值列(Hong Kong Residents)给分解函数
  3. 可选:指定period参数(日度数据的周周期可设为7,statsmodels也会自动推断,但手动指定更稳妥)

修改后的代码片段

替换原代码中时间序列分解部分的代码:

# 修正后的时间序列分解代码
from statsmodels.tsa.seasonal import seasonal_decompose

# 将Date设为索引,仅保留客流数值列
df_XRL_ts = df_XRL.set_index('Date')['Hong Kong Residents']
# 执行分解,指定周周期为7
decomposition = seasonal_decompose(df_XRL_ts, model="additive", period=7)
# 绘制分解结果
decomposition.plot()
plt.rcParams['axes.labelsize'] = 16
plt.rcParams['axes.titlesize'] = 16
plt.show()

这样处理后,函数会正确识别时间索引,仅对客流数值进行趋势、季节性和残差的分解,不会再出现类型转换错误,能正常输出可视化结果。


内容的提问来源于stack exchange,提问作者ronzenith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:15:28