我的知识记录

Python pandas时间日期处理教程

用pandas处理字符串日期转datetime、提取年月日时分、日期加减、按日期分组,解决Excel里日期格式混乱的常见痛点。

场景痛点

Excel里的日期五花八门:有的是"2024/1/5",有的是"2024-01-05 10:30",有的甚至是Excel序列号45234。想按月汇总、算周同比,手动改格式能改到崩溃。pandas的 to_datetime 一把统一格式,再用 .dt 访问器提取年月日、做加减。

用到的库

pip install pandas

完整代码

import pandas as pd

def date_ops():
df = pd.DataFrame({
"order_time": ["2024/1/5 09:30", "2024-01-05 14:20", "2024.1.6 10:00", "2024/2/1 16:45"],
"amount":     [100, 200, 150, 300],
})

# 1. 统一转datetime,自动识别多种格式
df["order_time"] = pd.to_datetime(df["order_time"], errors="coerce")

# 2. 提取年、月、日、星期、小时
df["year"]    = df["order_time"].dt.year
df["month"]   = df["order_time"].dt.month
df["day"]     = df["order_time"].dt.day
df["weekday"] = df["order_time"].dt.weekday  # 0=周一
df["hour"]    = df["order_time"].dt.hour

# 3. 日期加减:下单后7天的到期日
df["due_date"] = df["order_time"] + pd.Timedelta(days=7)

# 4. 格式化输出成字符串
df["order_date_str"] = df["order_time"].dt.strftime("%Y-%m-%d")

print(df)

# 5. 按月分组汇总
monthly = df.groupby(df["order_time"].dt.to_period("M"))["amount"].sum()
print("\n按月汇总:")
print(monthly)

if __name__ == "__main__":
date_ops()

代码讲解

  • pd.to_datetime(series, errors="coerce") 自动识别多种日期格式,识别不了的变成NaN而不是报错,errors="raise" 会直接抛异常。
  • .dt.year.dt.month 等访问器把datetime列拆成单独字段,做透视表、按月汇总特别方便。
  • pd.Timedelta(days=7) 做日期加减,支持days、hours、minutes、weeks等单位。
  • .dt.to_period("M") 把日期截断到月,配合groupby直接按月聚合,不用先提取month再分组。
  • strftime("%Y-%m-%d") 把datetime格式化成字符串,导出Excel时用。

运行结果

控制台打印处理后的DataFrame,包含原始时间、年月日时分字段、加7天的到期日、格式化字符串,以及按月汇总的金额。4条记录分布在1月和2月,按月份分组后两月各有合计。

注意事项

  • Excel导出的日期有时被读成浮点数(Excel序列号),用 pd.to_datetime(series, unit="D", origin="1899-12-30") 转换。
  • 时区敏感场景,先用 df["order_time"].dt.tz_localize("Asia/Shanghai") 加时区,否则跨时区计算会错。
  • to_datetime 对几千行很快,但百万行建议指定 format="%Y/%m/%d %H:%M" 显式格式,速度快几倍。
  • 空值在 .dt.xxx 下自动保持NaN,不会报错,但导出前要确认。

Python pandas时间日期处理教程

标签:

更新时间:2026-09-14 20:57:23

上一篇:Python pandas分组聚合groupby实战

下一篇:Python pandas多表合并concat merge详解