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类型就会触发转换错误。
修复步骤
- 将
Date列设置为DataFrame的索引,确保索引为Datetime类型 - 仅传入客流数值列(
Hong Kong Residents)给分解函数 - 可选:指定
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
相关产品推荐
相关产品推荐

