转换日期:从年份和周数转换为日期时间

Posted

技术标签:

【中文标题】转换日期:从年份和周数转换为日期时间【英文标题】:Transforming dates: from year and week number into datetime 【发布时间】:2019-08-12 16:20:53 【问题描述】:

我正在尝试转换以下数据框

id  year  week 
 1  2018    43
 1  2019     1
 2  2019     4
 3  2018    51

放入包含以下列的数据框

id  year  week  year_week
 1  2018    43    2018-43
 1  2019     1     2019-1
 2  2019     4     2019-4
 3  2018    51    2018-51

其中“year_week”是日期时间类型

【问题讨论】:

2018-43 是什么日期时间? 要建立一个你需要年、月、日的日期,使用 year_week 你可以知道月但不知道日 @Blorgbeard datetime.now().strftime('%Y-%W') -> 2019-11 【参考方案1】:

您需要选择一周中的某一天才能根据该数据创建时间戳。假设这些是ISO weeks,我为 ISO 周开始的星期一选择了“1”(还添加了一个列以转换为您的问题中显示的字符串格式)。

如果您确实希望列数据为 datetime objects 而不是 pandas.Timestamp,请参阅 Converting between datetime and Timestamp objects 了解您需要包含的另一个步骤。

from datetime import datetime
import pandas as pd

def year_week(y, w):
    return datetime.strptime(f'y w 1', '%G %V %u')

df = pd.DataFrame([(2018, 43), (2019, 1), (2019, 4), (2018, 51)], columns=['year', 'week'])
df['year_week_ts'] = df.apply(lambda row: year_week(row.year, row.week), axis=1)
df['year_week_str'] = df.apply(lambda row: row.year_week_ts.strftime('%G-%V'), axis=1)

print(df)
#    year  week year_week_ts year_week_str
# 0  2018    43   2018-10-22       2018-43
# 1  2019     1   2018-12-31       2019-01
# 2  2019     4   2019-01-21       2019-04
# 3  2018    51   2018-12-17       2018-51

# for python 3 versions pre-3.6 use '  1'.format(y, w) instead of the f string above

【讨论】:

【参考方案2】:

您可能想看看epiweeks 包!

鉴于您提供的数据并假设 ISO 周编号系统,假设您要创建一个包含周结束日期的列:

from epiweeks import Week

df['ending'] = df.apply(
        lambda row: pd.to_datetime(Week(row.year, row.week, 'iso').enddate()),
        axis=1
)

这会产生一个日期时间类型的新列。

希望你正在寻找什么。

【讨论】:

以上是关于转换日期:从年份和周数转换为日期时间的主要内容,如果未能解决你的问题,请参考以下文章

将日期列转换为周数、日期、月份、年份

python - 如何将带有年份的周数转换为python pandas中的日期时间格式?

将一年中的数字星期转换为 hiveql 中的日期 (yyyy-mm-dd)

从Python中的ISO周数获取日期[重复]

Redshift:提取给定星期和年份的星期六日期

怎么取两个日期之间的周数