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

使用pd.to_timedelta将DataFrame秒转分钟:手动可行CSV报错

问题解决:pd.to_timedelta读取CSV后转换报错

报错原因

你读取CSV时使用了header=[0,1],这会让pandas把前两行解析为多层列索引(MultiIndex),此时df['Time']是一个包含s列的DataFrame,而非一维的Series。而pd.to_timedelta只接受字符串、timedelta对象、一维数组或Series作为输入,传入DataFrame就会触发TypeError。

手动输入数据时,df['Time']是单个Series,符合pd.to_timedelta的参数要求,所以能正常执行。

解决方案

根据你的需求,有两种处理方式:

方式1:调整CSV读取逻辑,生成单列表

如果不需要保留第二行的"s"作为单位标识,可以跳过第二行,只取第一行作为表头:

# 跳过第二行(索引为1),第一行作为表头
df = pd.read_csv("sec.csv", header=0, skiprows=[1])
# 将秒数转换为timedelta类型(单位指定为秒)
df['Time'] = pd.to_timedelta(df['Time'], unit='s')
# 若要转换为以分钟为单位的timedelta,可先将秒数除以60再转换
# df['Time'] = pd.to_timedelta(df['Time']/60, unit='min')

方式2:保留多层索引,提取具体Series转换

如果需要保留原有的多层列结构,直接提取s列对应的Series进行转换:

df = pd.read_csv("sec.csv", header=[0,1])
# 提取多层索引下的具体列(Series)
df[('Time', 's')] = pd.to_timedelta(df[('Time', 's')], unit='s')
# 同样,若要转分钟单位:
# df[('Time', 's')] = pd.to_timedelta(df[('Time', 's')]/60, unit='min')

补充说明

你执行df['Time'].astype('float64')后,输出仍显示Time s float64,这是因为df['Time']是DataFrame,astype操作是对该DataFrame内的列进行类型转换,结构依然是DataFrame,而非Series,所以无法被pd.to_timedelta处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:57:37