cover

走马

陈粒

时间处理

时间处理

时间处理#

先准备基础数据(带时间字段的销售数据)#

import pandas as pd
import 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
销售额 int64
dtype: object
转换后的数据:
订单时间 商品类别 销售额
0 2024-01-05 08:30:25 电子产品 5000
1 2024-01-05 14:20:10 服装 1200
2 2024-01-06 09:15:30 电子产品 3800
3 2024-02-10 10:00:00 服装 1800
4 2024-02-10 16:40:50 电子产品 6500
5 2024-03-15 11:25:15 服装 2200

2. 处理特殊格式时间#

如果时间格式不是标准的 YYYY-MM-DD(比如 2024/01/0505-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 电子产品 5000
2024-01-05 14:20:10 服装 1200
2024-01-06 09:15:30 电子产品 3800
2024-02-10 10:00:00 服装 1800
2024-02-10 16:40:50 电子产品 6500
2024-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 10000
2024-02-29 8300
2024-03-31 2200
Freq: 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
服装 1200
2024-02-29 电子产品 6500
服装 1800
2024-03-31 服装 2200
Name: 销售额, dtype: int64

五、时间计算:时间差(Timedelta)与时间偏移(DateOffset)#

1. 计算时间差(Timedelta)#

比如计算两个订单的时间间隔、订单距今的天数:

# 取第一个和最后一个订单时间
first_time = df_reset["订单时间"].iloc[0]
last_time = df_reset["订单时间"].iloc[-1]
# 计算时间差
time_diff = last_time - first_time
print(f"\n第一个订单到最后一个订单的时间差:{time_diff}")
print(f"时间差(天数):{time_diff.days} 天")
# 计算每个订单距今的天数(当前时间 - 订单时间)
df_reset["距今天数"] = (pd.Timestamp.now() - df_reset["订单时间"]).dt.days
print("\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天"]])

总结#

  1. 基础核心:先用 pd.to_datetime() 将字符串时间转为 datetime64 类型,再将其设为时间索引,是后续所有时间操作的前提;
  2. 筛选技巧:时间索引支持「范围切片」,也可通过 .dt.year/.month/.hour 提取属性筛选;
  3. 聚合核心resample() 是按时间粒度聚合的关键(D/ M/ Y 等规则),可结合 groupby 实现多维度时间聚合;
  4. 时间计算Timedelta 计算时间差,DateOffset 实现时间加减,满足时间偏移需求。

文章目录

✨️ 复制成功,转载请标注本文地址