【发布时间】:2018-01-08 06:21:00
【问题描述】:
我有一个数据框,它提供了两个整数列,其中包含一年中的年份和星期:
import pandas as pd
import numpy as np
L1 = [43,44,51,2,5,12]
L2 = [2016,2016,2016,2017,2017,2017]
df = pd.DataFrame({"Week":L1,"Year":L2})
df
Out[72]:
Week Year
0 43 2016
1 44 2016
2 51 2016
3 2 2017
4 5 2017
5 12 2017
我需要从这两个数字创建一个日期时间对象。
我试过了,但它抛出了一个错误:
df["DT"] = df.apply(lambda x: np.datetime64(x.Year,'Y') + np.timedelta64(x.Week,'W'),axis=1)
然后我尝试了这个,它有效但给出了错误的结果,即它完全忽略了一周:
df["S"] = df.Week.astype(str)+'-'+df.Year.astype(str)
df["DT"] = df["S"].apply(lambda x: pd.to_datetime(x,format='%W-%Y'))
df
Out[74]:
Week Year S DT
0 43 2016 43-2016 2016-01-01
1 44 2016 44-2016 2016-01-01
2 51 2016 51-2016 2016-01-01
3 2 2017 2-2017 2017-01-01
4 5 2017 5-2017 2017-01-01
5 12 2017 12-2017 2017-01-01
我真的在 Python 的 datetime、Numpy 的 datetime64 和 pandas Timestamp 之间迷路了,你能告诉我它是如何正确完成的吗?
我正在使用 Python 3,如果这在任何方面都相关的话。
编辑:
从 Python 3.8 开始,使用 datetime.date 对象上新引入的方法可以轻松解决该问题:https://docs.python.org/3/library/datetime.html#datetime.date.fromisocalendar
【问题讨论】:
-
Week的值是 ISO week numbers 还是代表 7 天的单位? -
最初我在
s中有时间戳,它们使用pd.to_datetime()转换,然后使用时间戳上的dt.week提取星期。 -
这里有一个微妙的陷阱——如果
s包含日期2016-1-1,那么它的ISO周数(由dt.week返回)是53,它的ISO年(你没有't record) 是 2015 年。如果您尝试使用 2016 年和 ISO 第 53 周来重构日期,那么您会得到 2017-01-02(假设星期一开始一周)。因此,除非您还记录 ISO 年份(并不总是与实际年份相同),否则您无法正确往返。 -
@unutbu 谢谢,很高兴知道这一点。
标签: python pandas datetime numpy