如何从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)
运行后就能得到你想要的结果:
| text | start time | end time | delta |
|---|---|---|---|
| 10:30:00-12:30:00 some random text(some special caracters [-'(@ )... | 1900-01-01 10:30:00 | 1900-01-01 12:30:00 | 02:00:00 |
| 15:35:10-15:36:12 some other text some numbers 9875321651132 | 1900-01-01 15:35:10 | 1900-01-01 15:36:12 | 00:01:02 |
关键步骤解释
正则提取优化:
你之前想用str.extract的思路完全正确,我把两次提取合并成了一次,用正则^(\d{2}:\d{2}:\d{2})-(\d{2}:\d{2}:\d{2}):^确保只匹配字符串开头的时间(\d{2}:\d{2}:\d{2})是两个捕获组,分别匹配开始时间和结束时间的HH:MM:SS格式- 中间的
-就是时间分隔符,用来定位两个时间的边界
时间类型转换:
把提取到的字符串时间转成datetime类型,这样才能直接做减法运算。指定format='%H:%M:%S'可以让解析更准确,避免pandas自动推断出错。时间差格式化:
直接相减得到的是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
相关产品推荐
相关产品推荐

