Pandas Series.dt.week与pd.Period.strftime - 有什么区别?

问题描述 投票:0回答:1

在大熊猫系列日期上操作时,可以通过两种不同的方式分离周数,从而产生不同的结果。

在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
python pandas datetime week-number
1个回答
0
投票

这是因为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。

  • %U - 获取周数,使用星期日作为星期的第一天
  • %W - 获取周数,使用星期一作为星期的第一天
© www.soinside.com 2019 - 2024. All rights reserved.