时间处理
时间处理
先准备基础数据(带时间字段的销售数据)
import pandas as pdimport numpy as np
# 模拟一份电商销售数据(字符串格式的时间)data = { "订单时间": ["2024-01-05 08:30:25", "2024-01-05 14:20:10", "2024-01-06 09:15:30", "2024-02-10 10:00:00", "2024-02-10 16:40:50", "2024-03-15 11:25:15"], "商品类别": ["电子产品", "服装", "电子产品", "服装", "电子产品", "服装"], "销售额": [5000, 1200, 3800, 1800, 6500, 2200]}df = pd.DataFrame(data)print("原始数据(时间为字符串):")print(df)一、核心基础:时间类型转换(字符串→datetime)
Pandas 中处理时间的前提是把字符串格式的时间转换成 datetime64 类型(Pandas 专属的时间类型),核心函数是 pd.to_datetime()。
1. 基础转换
# 将「订单时间」列从字符串转为datetime类型df["订单时间"] = pd.to_datetime(df["订单时间"])print("\n转换后的数据类型:")print(df.dtypes) # 订单时间列变为 datetime64[ns]print("\n转换后的数据:")print(df)输出(时间列从字符串变成可操作的时间类型):
转换后的数据类型:订单时间 datetime64[ns]商品类别 object销售额 int64dtype: object
转换后的数据: 订单时间 商品类别 销售额0 2024-01-05 08:30:25 电子产品 50001 2024-01-05 14:20:10 服装 12002 2024-01-06 09:15:30 电子产品 38003 2024-02-10 10:00:00 服装 18004 2024-02-10 16:40:50 电子产品 65005 2024-03-15 11:25:15 服装 22002. 处理特殊格式时间
如果时间格式不是标准的 YYYY-MM-DD(比如 2024/01/05、05-01-2024),需要指定 format 参数:
# 示例:处理「月/日/年 时:分」格式time_str = ["01/05/2024 08:30", "02/10/2024 10:00"]dt = pd.to_datetime(time_str, format="%m/%d/%Y %H:%M")print("\n特殊格式时间转换结果:")print(dt)二、时间索引:把时间列设为索引(方便时间筛选 / 聚合)
将 datetime 类型的列设为行索引(时间索引),是 Pandas 处理时间序列的核心技巧,能大幅简化后续操作。
# 将「订单时间」设为索引(inplace=True 直接修改原DF)df.set_index("订单时间", inplace=True)print("\n设置时间索引后的数据:")print(df)输出(行索引变成时间,可按时间快速筛选):
商品类别 销售额订单时间2024-01-05 08:30:25 电子产品 50002024-01-05 14:20:10 服装 12002024-01-06 09:15:30 电子产品 38002024-02-10 10:00:00 服装 18002024-02-10 16:40:50 电子产品 65002024-03-15 11:25:15 服装 2200三、时间筛选:按年 / 月 / 日 / 小时筛选数据
有了时间索引后,可通过「标签切片」或「属性筛选」快速提取指定时间段的数据。
1. 按时间范围切片(最常用)
# 筛选 2024年1月 的所有数据df_jan = df["2024-01"]print("\n2024年1月的销售数据:")print(df_jan)
# 筛选 2024-01-05 到 2024-02-10 的数据df_range = df["2024-01-05":"2024-02-10"]print("\n2024-01-05 至 2024-02-10 的数据:")print(df_range)2. 按时间属性筛选(年 / 月 / 日 / 小时)
datetime 类型支持直接提取 year/month/day/hour 等属性:
# 重置索引(方便演示属性筛选)df_reset = df.reset_index()# 筛选「10点到18点」的订单(小时数在10~18之间)df_hour = df_reset[df_reset["订单时间"].dt.hour.between(10, 18)]print("\n10~18点的订单数据:")print(df_hour[["订单时间", "商品类别", "销售额"]])
# 筛选「2月份」的订单df_feb = df_reset[df_reset["订单时间"].dt.month == 2]print("\n2月份的订单数据:")print(df_feb[["订单时间", "商品类别", "销售额"]])四、时间重采样(resample):按时间粒度聚合
重采样是「将时间序列数据从一个粒度转换为另一个粒度」,比如:
- 按「天」聚合→按「月」聚合(细粒度→粗粒度,降采样);
- 按「月」聚合→按「天」插值(粗粒度→细粒度,升采样)。
核心语法
df.resample(规则).聚合函数()常用规则:D(天)、W(周)、M(月)、Q(季度)、Y(年)、H(小时)。
示例:按「月」聚合销售额
# 重置索引(恢复订单时间列)df_reset = df.reset_index()# 先设回时间索引,再按「月」聚合df_resample = df_reset.set_index("订单时间").resample("M")["销售额"].sum()# 重命名列(更易读)df_resample = df_resample.rename("月度总销售额")print("\n按月聚合的销售额:")print(df_resample)输出(清晰看到 1/2/3 月的总销售额):
订单时间2024-01-31 100002024-02-29 83002024-03-31 2200Freq: M, Name: 月度总销售额, dtype: int64多维度重采样(按「月 + 商品类别」聚合)
# 按「月」和「商品类别」分组聚合df_resample_multi = df_reset.set_index("订单时间").groupby([pd.Grouper(freq="M"), "商品类别"])["销售额"].sum()print("\n按月+商品类别聚合的销售额:")print(df_resample_multi)输出(精准看到每个月不同类别的销售额):
订单时间 商品类别2024-01-31 电子产品 8800 服装 12002024-02-29 电子产品 6500 服装 18002024-03-31 服装 2200Name: 销售额, dtype: int64五、时间计算:时间差(Timedelta)与时间偏移(DateOffset)
1. 计算时间差(Timedelta)
比如计算两个订单的时间间隔、订单距今的天数:
# 取第一个和最后一个订单时间first_time = df_reset["订单时间"].iloc[0]last_time = df_reset["订单时间"].iloc[-1]# 计算时间差time_diff = last_time - first_timeprint(f"\n第一个订单到最后一个订单的时间差:{time_diff}")print(f"时间差(天数):{time_diff.days} 天")
# 计算每个订单距今的天数(当前时间 - 订单时间)df_reset["距今天数"] = (pd.Timestamp.now() - df_reset["订单时间"]).dt.daysprint("\n每个订单距今的天数:")print(df_reset[["订单时间", "商品类别", "距今天数"]])2. 时间偏移(DateOffset):加减时间
比如给订单时间加 1 个月、减 3 天:
# 订单时间加1个月df_reset["订单时间+1个月"] = df_reset["订单时间"] + pd.DateOffset(months=1)# 订单时间减3天df_reset["订单时间-3天"] = df_reset["订单时间"] - pd.DateOffset(days=3)print("\n时间偏移后的结果:")print(df_reset[["订单时间", "订单时间+1个月", "订单时间-3天"]])总结
- 基础核心:先用
pd.to_datetime()将字符串时间转为datetime64类型,再将其设为时间索引,是后续所有时间操作的前提; - 筛选技巧:时间索引支持「范围切片」,也可通过
.dt.year/.month/.hour提取属性筛选; - 聚合核心:
resample()是按时间粒度聚合的关键(D/ M/ Y 等规则),可结合groupby实现多维度时间聚合; - 时间计算:
Timedelta计算时间差,DateOffset实现时间加减,满足时间偏移需求。

















