Python中移除DataFrame时间戳日期并计算时间差的方法
问题描述
我有如下DataFrame:
Load sort_begin comp_begin a Mon Jan 15 23:17:58 PST 2024 - b Mon Jan 15 23:17:58 PST 2024 Mon Jan 15 23:23:58 PST 2024 c Mon Jan 15 23:17:58 PST 2024 Mon Jan 15 23:17:58 PST 2024
需要完成两个需求:
- 移除列中时间戳的日、月、年部分,仅保留
H:M:S PST格式的时间(时间戳可为空值或“-”),得到如下df2:
df2 = Load sort_begin comp_begin a 23:17:58 PST - b 23:17:58 PST 23:23:58 PST c 23:17:58 PST 23:17:58 PST
- 高效计算
sort_begin与comp_begin的秒级时间差并新增diff列,得到如下df3:
df3 = Load sort_begin comp_begin diff a 23:17:58 PST - - b 23:17:58 PST 23:23:58 PST 360 sec c 23:17:58 PST 23:17:58 PST 0 sec
一、提取目标时间格式得到df2
直接用字符串分割的方法最直观高效,原始时间戳格式固定,按空格拆分后,第3、4个元素(从0开始计数)正好是我们要的H:M:S和PST,直接拼接即可:
import pandas as pd # 构造原始DataFrame(已有则跳过) df = pd.DataFrame({ 'Load': ['a', 'b', 'c'], 'sort_begin': ['Mon Jan 15 23:17:58 PST 2024', 'Mon Jan 15 23:17:58 PST 2024', 'Mon Jan 15 23:17:58 PST 2024'], 'comp_begin': ['-', 'Mon Jan 15 23:23:58 PST 2024', 'Mon Jan 15 23:17:58 PST 2024'] }) df2 = df.copy() # 遍历目标列处理 for col in ['sort_begin', 'comp_begin']: df2[col] = df2[col].apply(lambda x: ' '.join(x.split()[3:5]) if x != '-' else '-') print(df2)
二、计算秒级时间差得到df3
要计算时间差需先把字符串转成可计算的datetime对象,由于所有时间都是PST时区,可给时间字符串拼接固定日期(日期不影响时间差计算),转成datetime后再算差值:
方法1:适合小数据集
df3 = df2.copy() # 定义时间转换函数 def str_to_dt(s): if s == '-': return pd.NaT # 用NaT标记空时间 return pd.to_datetime('2024-01-01 ' + s) # 转换时间列 df3['sort_dt'] = df3['sort_begin'].apply(str_to_dt) df3['comp_dt'] = df3['comp_begin'].apply(str_to_dt) # 计算秒级差值并格式化输出 df3['diff'] = df3.apply(lambda row: f'{(row["comp_dt"] - row["sort_dt"]).total_seconds()} sec' if pd.notna(row['sort_dt']) and pd.notna(row['comp_dt']) else '-', axis=1) # 删除中间辅助列 df3 = df3.drop(['sort_dt', 'comp_dt'], axis=1) print(df3)
方法2:高效批量处理(适合大数据集)
如果数据量较大,逐行apply效率偏低,改用批量处理:
df3 = df2.copy() # 批量转换时间列 for col in ['sort_begin', 'comp_begin']: # 筛选非空行 mask = df3[col] != '-' # 批量转datetime df3.loc[mask, f'{col}_dt'] = pd.to_datetime('2024-01-01 ' + df3.loc[mask, col]) # 空值设为NaT df3.loc[~mask, f'{col}_dt'] = pd.NaT # 计算差值 df3['diff'] = df3.apply(lambda x: f'{(x["comp_begin_dt"] - x["sort_begin_dt"]).total_seconds()} sec' if pd.notna(x["sort_begin_dt"]) and pd.notna(x["comp_begin_dt"]) else '-', axis=1) # 删除辅助列 df3 = df3.drop(['sort_begin_dt', 'comp_begin_dt'], axis=1) print(df3)
内容的提问来源于stack exchange,提问作者user3555115
相关产品推荐
相关产品推荐

