Pandas:如何获取同一日期首尾行并计算时间差?
解决方法
要实现按日期计算时间跨度并添加新列,你可以按照以下步骤操作:
- 转换时间列类型:先把
Time列从字符串转为可计算的时间类型,才能进行减法运算。 - 分组计算时间跨度:通过
groupby('Date')分组后,对每组的Time列取最后一行和第一行的值做差,得到该日期的总跨度。 - 合并结果到原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
相关产品推荐
相关产品推荐

