【发布时间】:2019-06-22 01:41:54
【问题描述】:
在对 pandas 日期系列进行操作时,可以通过两种不同的方式来隔离周数,从而产生不同的结果。
对 numpy.datetime64 值或系列中的 pd.Period 使用 .dt.week 访问器会产生与在相同对象上使用 pd.Period.strftime 不同的结果。 pd.Period.strftime 的在线文档指出,在年初第一次出现开始周之前的所有天都计为第 0 周。这遵循标准的 python strftime 行为。
.dt.week 访问器似乎从 1 开始并在 52 周后重新启动,使 2018 年的最后两天成为 2019 年的第 1 周。pd.Series.dt.week 的在线文档仅声明它返回一年中的第几周。这似乎是 iso 周数?
为什么这两种方法的行为会有这种差异?应该使用哪一个,为什么?如何从单个 python 日期时间(或 pd.Period 或 pd.timestamp)对象(而不是系列)优雅地获取 iso 周数?
df2 = pd.DataFrame({"Date_string": ["2018-12-27", "2018-12-28","2018-12-29", "2018-12-30", "2018-12-31", "2019-01-01", "2019-01-02", "2019-01-03", "2019-01-04", "2019-01-05", "2019-01-06", "2019-01-07",]})
df2["Date_datestamp"] = pd.to_datetime(df2["Date_string"], format='%Y-%m-%d')
df2["Date_period"] = df2['Date_datestamp'].dt.to_period("D")
df2["Week1"] = df2['Date_period'].apply(lambda x: (x + timedelta(days=1)).week)
df2["Week2"] = df2['Date_period'].apply(lambda x: x.strftime("%U"))
df2
返回
Date_string Date_datestamp Date_period Week1 Week2
0 2018-12-27 2018-12-27 2018-12-27 52 51
1 2018-12-28 2018-12-28 2018-12-28 52 51
2 2018-12-29 2018-12-29 2018-12-29 52 51
3 2018-12-30 2018-12-30 2018-12-30 1 52
4 2018-12-31 2018-12-31 2018-12-31 1 52
5 2019-01-01 2019-01-01 2019-01-01 1 00
6 2019-01-02 2019-01-02 2019-01-02 1 00
7 2019-01-03 2019-01-03 2019-01-03 1 00
8 2019-01-04 2019-01-04 2019-01-04 1 00
9 2019-01-05 2019-01-05 2019-01-05 1 00
10 2019-01-06 2019-01-06 2019-01-06 2 01
11 2019-01-07 2019-01-07 2019-01-07 2 01
【问题讨论】:
标签: python pandas datetime week-number