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

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 

需要完成两个需求:

  1. 移除列中时间戳的日、月、年部分,仅保留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 
  1. 高效计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:13:22