使用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
相关产品推荐
相关产品推荐

