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

Pandas:如何获取同一日期首尾行并计算时间差?

解决方法

要实现按日期计算时间跨度并添加新列,你可以按照以下步骤操作:

  1. 转换时间列类型:先把Time列从字符串转为可计算的时间类型,才能进行减法运算。
  2. 分组计算时间跨度:通过groupby('Date')分组后,对每组的Time列取最后一行和第一行的值做差,得到该日期的总跨度。
  3. 合并结果到原DataFrame:把计算出的跨度映射回原表,添加为新列。

完整代码如下:

import pandas as pd

# 示例数据
df = pd.DataFrame({"Date": ["01.01.2020", "01.01.2020", "01.01.2020", "02.02.2022", "02.02.2022"], 
                   "Time": ["12:00", "13:00", "14:45", "02:00", "08:00"]})

# 把Time列转为可计算的时间戳格式
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M')

# 分组计算每个日期的时间跨度:最后一条记录的时间 - 第一条记录的时间
date_spans = df.groupby('Date')['Time'].agg(lambda x: x.iloc[-1] - x.iloc[0])

# 将时间跨度映射回原DataFrame,添加为新列
df['Time_Span'] = df['Date'].map(date_spans)

print(df)

代码说明

  • 转换Time列时,用pd.to_datetime配合format='%H:%M'精准解析字符串时间,得到可直接运算的时间戳对象。
  • 分组聚合时,通过lambda函数快速获取每组的首尾时间并做差,得到的结果是timedelta类型(比如0 days 02:45:00)。
  • 最后用map方法将每个日期对应的跨度匹配到原表的每一行,确保同一日期的所有行都拥有相同的时间跨度值。

如果需要把时间跨度转为更直观的字符串格式(比如2:45),可以添加以下代码:

# 将timedelta转为HH:MM格式的字符串
df['Time_Span_Str'] = df['Time_Span'].apply(lambda x: f"{x.components.hours}:{x.components.minutes}")

运行后输出结果:

Date                Time        Time_Span Time_Span_Str
0  01.01.2020 1900-01-01 12:00:00 0 days 02:45:00          2:45
1  01.01.2020 1900-01-01 13:00:00 0 days 02:45:00          2:45
2  01.01.2020 1900-01-01 14:45:00 0 days 02:45:00          2:45
3  02.02.2022 1900-01-01 02:00:00 0 days 06:00:00          6:0
4  02.02.2022 1900-01-01 08:00:00 0 days 06:00:00          6:0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:50:26