如何将Pandas列转为timedelta并去除天数仅保留时分秒
解决方法
步骤1:统一时间字符串格式
网站提取的时间字符串存在两种格式(H:MM:SS和HH:MM),首先需要将它们标准化为HH:MM:SS格式,避免pd.to_timedelta解析失败:
# 先去除字符串前后的多余空格 df['Chip Time'] = df['Chip Time'].str.strip() # 定义函数补全格式 def standardize_time(s): parts = s.split(':') if len(parts) == 2: # 将"小时:分钟"补全为"小时:分钟:00" return f"{parts[0]}:{parts[1]}:00" return s # 已为H:MM:SS格式的直接返回 df['Chip Time'] = df['Chip Time'].apply(standardize_time)
步骤2:转换为timedelta类型
标准化后所有字符串都是HH:MM:SS格式,pd.to_timedelta可以正确解析:
df['Chip Time'] = pd.to_timedelta(df['Chip Time'], errors='coerce')
这一步完成后,"1:38:17"会转为0 days 01:38:17,"36:21"会转为1 days 12:21:00(36小时=1天12小时)。
步骤3:格式化为无天数的时分秒字符串
如果需要去掉天数部分,只保留总小时数:分钟:秒的格式(比如把1天12小时21分转为36:21:00),通过总秒数计算格式化:
def format_timedelta(td): if pd.isna(td): return None total_sec = int(td.total_seconds()) hours = total_sec // 3600 mins = (total_sec % 3600) // 60 secs = total_sec % 60 # 用0补位确保格式统一为两位数字 return f"{hours:02d}:{mins:02d}:{secs:02d}" # 生成格式化后的字符串列 df['Chip Time Formatted'] = df['Chip Time'].apply(format_timedelta)
为什么之前的方法失败?
- 直接用
pd.to_timedelta处理"36:21"时,默认会将单冒号字符串解析为分钟:秒,与你的实际数据含义(小时:分钟)不符,导致解析错误返回NaT; - 你尝试的
pd.to_timedelta(df[' Chip Time'].dt.days, unit='d')仅提取了timedelta的天数部分,自然丢失了小时、分钟、秒的核心信息。
内容的提问来源于stack exchange,提问作者Riyat Likita
相关产品推荐
相关产品推荐

