如何在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
相关产品推荐
相关产品推荐

