如何使用Python Pandas将带冒号的时长字符串转换为整数/浮点数/时间类型?
如何使用Python Pandas将带冒号的时长字符串转换为整数/浮点数/时间类型?
嗨,我之前也踩过一模一样的坑!你直接用astype(int)失败太正常了——这些字符串里有冒号,不是纯数字格式,Pandas根本没法直接解析。下面根据你不同的需求,给你几种实用的解决方案:
一、转成总秒数(整数类型)
如果你需要把时长转换成总秒数(比如"20:10"变成1210),有两种简单方法:
- 方法1:拆分字符串手动计算
test_df['Time_of_possession_sec'] = test_df['Time_of_possession'].apply( lambda x: int(x.split(':')[0]) * 60 + int(x.split(':')[1]) )
思路超直观:用split(':')把"20:10"拆成['20', '10'],分别转成整数后,分钟数乘60加上秒数,就得到了纯整数的总秒数。
- 方法2:用Pandas内置函数更简洁
test_df['Time_of_possession_sec'] = pd.to_timedelta(test_df['Time_of_possession']).dt.total_seconds().astype(int)
pd.to_timedelta能自动识别"MM:SS"这种时长格式,先转成Pandas的Timedelta类型,再用dt.total_seconds()提取总秒数,最后转成整数即可。
二、转成总分钟数(浮点数类型)
如果需要把时长转换成以分钟为单位的浮点数(比如"20:10"≈20.17),可以这么做:
# 方法1:拆分计算 test_df['Time_of_possession_min'] = test_df['Time_of_possession'].apply( lambda x: int(x.split(':')[0]) + int(x.split(':')[1]) / 60 ) # 方法2:用Timedelta转换更高效 test_df['Time_of_possession_min'] = pd.to_timedelta(test_df['Time_of_possession']).dt.total_seconds() / 60
两种方法都是把秒数转换成分钟的小数部分,加上原有的分钟数,得到浮点数结果,特别适合做数值统计或者可视化分析。
三、转成时间差类型(Timedelta)
如果你之后要对时长做时间相关的运算(比如求和、比较大小、加减操作),直接转成Pandas的Timedelta类型是最优选择:
test_df['Time_of_possession_delta'] = pd.to_timedelta(test_df['Time_of_possession'])
转成Timedelta后,你可以直接执行这些实用操作:
# 计算所有记录的总控球时长 total_possession = test_df['Time_of_possession_delta'].sum() # 筛选控球时长超过15分钟的记录 long_possession = test_df[test_df['Time_of_possession_delta'] > pd.to_timedelta('15:00')]
这种类型保留了时间的语义,做时间运算会灵活很多。
备注:内容来源于stack exchange,提问作者user14182282
相关产品推荐
相关产品推荐

