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

如何在Python中为日期列生成Year-Week格式列?

解决Pandas生成Year-Week格式列的问题

没问题,我来帮你搞定这个需求。你需要的是从日期列生成YYYY-WW格式的周标识,这里关键是要正确处理年份和周数的对应(比如跨年的周会属于下一年的第一周),下面是具体的实现步骤和代码:

步骤1:读取并解析日期数据

首先我们需要把你提供的日期字符串转换成Pandas的日期类型,注意你的日期格式是dd.mm.yyyy(日.月.年),解析时要指定格式避免出错:

import pandas as pd

# 模拟你的输入数据(如果是从文件读取,直接用pd.read_csv即可)
raw_data = [
    [0, "04.01.2018"],
    [1, "04.01.2018"],
    [2, "04.01.2018"],
    [3, "04.01.2018"],
    [4, "05.01.2018"]
]

# 转换成DataFrame
df = pd.DataFrame(raw_data, columns=["index_col", "date_str"])

# 解析日期列,指定格式为dd.mm.yyyy
df["date"] = pd.to_datetime(df["date_str"], format="%d.%m.%Y")

步骤2:生成Year-Week格式列

这里提供两种可靠的方法,都能同时正确提取年份和周数,解决你提到的那篇文章无法覆盖的场景:

方法一:使用isocalendar()(推荐)

isocalendar()会返回包含year、week、day的DataFrame,我们可以直接提取年份和周数拼接,这种方式逻辑清晰,还能处理跨年周的情况(比如2023年12月31日属于2024年第1周):

# 提取ISO年份和周数,拼接成YYYY-WW格式(周数补零到2位)
df["year_week"] = df["date"].dt.isocalendar().year.astype(str) + "-" + df["date"].dt.isocalendar().week.astype(str).str.zfill(2)

方法二:使用strftime()格式化

直接用日期格式化字符串,其中%G代表ISO年份,%V代表ISO周数(1-53),一步到位生成目标格式:

df["year_week"] = df["date"].dt.strftime("%G-%V")

关于周定义的说明

你提到的例子中2018年1月4日对应第13周,这看起来和标准的ISO周定义不符(实际2018年1月4日是ISO第1周)。如果你的业务场景使用的是非标准周定义(比如每周从周六开始、或者周数计算规则不同),可以调整格式化参数:

  • 若使用周日作为一周起始,用%U表示周数(00-53),年份用%Y:
    df["year_week_us"] = df["date"].dt.strftime("%Y-%U")
    
  • 若使用周一作为一周起始但周数从0开始,用%W表示周数(00-53):
    df["year_week_w"] = df["date"].dt.strftime("%Y-%W")
    

运行上述代码后,你的DataFrame就会新增year_week列,完全符合YYYY-WW的格式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:32:22