如何基于DataFrame的年份与周数字段生成日期列
问题:通过年份和周数生成对应日期的pandas DataFrame列
我有一个包含Year(年份)和Week #(周数)列的pandas DataFrame,想要新增Date列,根据这两列的值生成对应日期。
当前DataFrame结构:
| Year | Week # |
|---|---|
| 2023 | 10 |
| 2023 | 11 |
| 2023 | 12 |
期望生成的DataFrame结构:
| Year | Week # | Date |
|---|---|---|
| 2023 | 10 | 3/6/23 |
| 2023 | 11 | 3/13/23 |
| 2023 | 12 | 3/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
相关产品推荐
相关产品推荐

