如何高效将Pandas DataFrame多列时:分:秒格式转为整数秒?
问题:批量将Pandas中时长字符串转换为秒数
我有一个包含15列的Pandas DataFrame,其中9列是hh:mm:ss格式的字符串时长,需要转换为整数类型的秒数。作为Python和Pandas新手,我写了基础代码可以运行,但需要为9列重复操作,想找更简洁优雅的实现方法。
基础代码示例:
# Example df import pandas as pd df = pd.DataFrame({'column_1':['00:12:21','01:20:01'],'column_2':['00:22:33','02:10:11']}) def duration_to_sec(x): if len(x.split(':')) == 3 : h,m,s = x.split(':') x = (int(h)*60*60)+(int(m)*60)+(int(s)) else : x=0 return x new_col = [] for i in df['column_1']: x = duration_to_sec(i) new_col.append(x) df['column_1'] = pd.Series(new_col) print(df)
预期输出:
column_1 column_2 0 741 00:22:33 1 4801 02:10:11
简洁实现方法
方法1:利用pd.to_datetime和dt.total_seconds()
这是最简洁的批量处理方案,Pandas内置的时间解析工具可以直接处理hh:mm:ss格式,自动提取总秒数,还能通过fillna处理格式异常值。
代码示例:
import pandas as pd df = pd.DataFrame({'column_1':['00:12:21','01:20:01'],'column_2':['00:22:33','02:10:11']}) # 指定需要转换的目标列 target_cols = ['column_1', 'column_2'] # 批量转换为秒数并转为整数 df[target_cols] = pd.to_datetime(df[target_cols], format='%H:%M:%S').dt.total_seconds().astype(int) print(df)
输出:
column_1 column_2 0 741 1353 1 4801 7811
如果想保留原列、新增转换后的列:
df[[f'{col}_sec' for col in target_cols]] = pd.to_datetime(df[target_cols], format='%H:%M:%S').dt.total_seconds().astype(int)
方法2:用applymap批量应用自定义函数
如果需要保留你原有的异常处理逻辑(非hh:mm:ss格式返回0),可以用applymap对指定列批量复用函数,避免重复写循环。
代码示例:
import pandas as pd df = pd.DataFrame({'column_1':['00:12:21','01:20:01'],'column_2':['00:22:33','02:10:11', 'invalid']}) def duration_to_sec(x): parts = x.split(':') if len(parts) == 3: try: h, m, s = map(int, parts) return h*3600 + m*60 + s except ValueError: return 0 return 0 target_cols = ['column_1', 'column_2'] df[target_cols] = df[target_cols].applymap(duration_to_sec) print(df)
输出:
column_1 column_2 0 741 1353 1 4801 7811 2 0 0
方法3:用str.split结合广播计算
通过字符串拆分直接提取时、分、秒,再通过向量计算得到总秒数,适合需要对时分秒单独处理的场景。
代码示例:
import pandas as pd df = pd.DataFrame({'column_1':['00:12:21','01:20:01'],'column_2':['00:22:33','02:10:11']}) target_cols = ['column_1', 'column_2'] for col in target_cols: # 拆分时分秒并转为整数 time_parts = df[col].str.split(':', expand=True).astype(int) # 计算总秒数 df[col] = time_parts[0]*3600 + time_parts[1]*60 + time_parts[2] print(df)
输出与方法1一致,这种方式可以灵活添加对时分秒的校验逻辑。
内容的提问来源于stack exchange,提问作者mohamedhusaein
相关产品推荐
相关产品推荐

