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

如何从DataFrame行的字符串中提取时间并生成新列

如何从DataFrame文本列提取开始/结束时间并计算时间差

咱们直接上可运行的解决方案,完全贴合你的需求:

import pandas as pd

# 构建示例DataFrame
data = {
    'text': [
        '10:30:00-12:30:00 some random text(some special caracters [-\'(@ ) some numbers 456231 386',
        '15:35:10-15:36:12 some other text some numbers 9875321651132'
    ]
}
df = pd.DataFrame(data)

# 1. 一次性提取开头的开始时间和结束时间
time_pattern = r'^(\d{2}:\d{2}:\d{2})-(\d{2}:\d{2}:\d{2})'
df[['start time', 'end time']] = df['text'].str.extract(time_pattern)

# 2. 将字符串时间转为datetime类型(方便计算差值)
df['start time'] = pd.to_datetime(df['start time'], format='%H:%M:%S')
df['end time'] = pd.to_datetime(df['end time'], format='%H:%M:%S')

# 3. 计算时间差并格式化为HH:MM:SS格式
df['delta'] = df['end time'] - df['start time']
df['delta'] = df['delta'].apply(lambda x: f"{x.components.hours:02d}:{x.components.minutes:02d}:{x.components.seconds:02d}")

print(df)

运行后就能得到你想要的结果:

textstart timeend timedelta
10:30:00-12:30:00 some random text(some special caracters [-'(@ )...1900-01-01 10:30:001900-01-01 12:30:0002:00:00
15:35:10-15:36:12 some other text some numbers 98753216511321900-01-01 15:35:101900-01-01 15:36:1200:01:02

关键步骤解释

  1. 正则提取优化:
    你之前想用str.extract的思路完全正确,我把两次提取合并成了一次,用正则^(\d{2}:\d{2}:\d{2})-(\d{2}:\d{2}:\d{2}):

    • ^确保只匹配字符串开头的时间
    • (\d{2}:\d{2}:\d{2})是两个捕获组,分别匹配开始时间和结束时间的HH:MM:SS格式
    • 中间的-就是时间分隔符,用来定位两个时间的边界
  2. 时间类型转换:
    把提取到的字符串时间转成datetime类型,这样才能直接做减法运算。指定format='%H:%M:%S'可以让解析更准确,避免pandas自动推断出错。

  3. 时间差格式化:
    直接相减得到的是timedelta对象,默认显示可能不是你要的02:00:00格式,所以用apply和components提取时分秒,再用02d补零格式化,确保输出是两位数字的时分秒。

如果你不想保留datetime类型的时间列,也可以在计算完差值后把start time和end time转回字符串格式,只保留时间部分:

df['start time'] = df['start time'].dt.time.astype(str)
df['end time'] = df['end time'].dt.time.astype(str)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:09:07