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

如何基于DataFrame的年份与周数字段生成日期列

问题:通过年份和周数生成对应日期的pandas DataFrame列

我有一个包含Year(年份)和Week #(周数)列的pandas DataFrame,想要新增Date列,根据这两列的值生成对应日期。

当前DataFrame结构:

YearWeek #
202310
202311
202312

期望生成的DataFrame结构:

YearWeek #Date
2023103/6/23
2023113/13/23
2023123/20/23

尝试的代码及错误

方法一:使用datetime.strptime

from datetime import datetime

df['Date'] = datetime.strptime('{}-{}-1'.format(df['Year'], df['Week #']), '%Y-%W-%w').strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'

错误信息:

ValueError: time data '0        2020\n1        2020\n2        2020\n3        2020\n4        2020\n         ... \n35913    2024\n35914    2024\n35915    2024\n35916    2024\n35917    2024\nName: Year, Length: 35918, dtype: int64-0        02\n1        03\n2        04\n3        05\n4        06\n         ..\n35913    42\n35914    43\n35915    44\n35916    45\n35917    46\nName: Week #, Length: 35918, dtype: object-1' does not match format '%Y-%W-%w'

方法二:使用isoweek.Week

from datetime import datetime
from isoweek import Week

df['Date'] = Week(df['Year'], df['Week #']).monday()

错误信息:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

错误原因

  • 方法一:datetime.strptime仅支持单个字符串输入,无法直接处理pandas Series,format方法会把整个Series转为字符串表示,导致格式完全不匹配。
  • 方法二:isoweek.Week的构造函数只接受单个数值参数,传入Series后,week < 1 or week > 52的判断会引发Series布尔值歧义错误。

解决方案

方法1:使用pandas内置to_datetime函数

pandas的to_datetime可直接处理Series,结合%Y-%W-%w格式(%W对应周起始为周一,%w中1代表周一):

import pandas as pd

# 生成周一的datetime类型日期
df['Date'] = pd.to_datetime(df['Year'].astype(str) + '-' + df['Week #'].astype(str) + '-1', format='%Y-%W-%w')
# 转换为目标格式(如3/6/23)
df['Date'] = df['Date'].dt.strftime('%m/%d/%y')

方法2:用apply结合isoweek库

通过apply逐行传入单值,适配isoweek的参数要求:

from isoweek import Week

df['Date'] = df.apply(lambda row: Week(row['Year'], row['Week #']).monday(), axis=1)
# 转换为目标格式
df['Date'] = df['Date'].dt.strftime('%m/%d/%y')

方法3:datetime结合apply逐行处理

自定义函数,通过apply逐行生成日期:

from datetime import datetime

def get_date(year, week):
    return datetime.strptime(f'{year}-{week}-1', '%Y-%W-%w').strftime('%m/%d/%y')

df['Date'] = df.apply(lambda row: get_date(row['Year'], row['Week #']), axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:55:18