在大熊猫系列日期上操作时,可以通过两种不同的方式分离周数,从而产生不同的结果。
在numpy.datetime64值或系列中的pd.Period上使用.dt.week
访问器会产生与在相同对象上使用pd.Period.strftime
不同的结果。 pd.Period.strftime的在线文档指出,在年初的第一次出现周之前的所有日期都计为第0周。这遵循标准的python strftime行为。
.dt.week
访问器似乎从1开始,并在52周后重新开始,2019年的最后两天是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
这是因为2018年实际上有53周。我建议使用一年一周的组合,比如说。
df2['Year-Week'] = df2['Date_period'].apply(lambda x: x.strftime('%Y-%U'))
编辑:要查看周数,您可以尝试
df2["Week2"] = df2['Date_period'].apply(lambda x: x.strftime("%W"))
这显示为第53周的2018-12-31。