【问题标题】:Pandas Series.dt.week vs. pd.Period.strftime - what's the difference?Pandas Series.dt.week 与 pd.Period.strftime - 有什么区别?
【发布时间】: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


    【解决方案1】:

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

    这将 2018-12-31 显示为第 53 周。

    • %U - 获取周数,使用星期日作为一周的第一天
    • %W - 获取周数,使用星期一作为一周的第一天

    【讨论】:

    • 谢谢,这并不能解释为什么 strftime 方法和 .week 方法之间存在差异,何时使用,或如何获取 iso 日期周数(与返回的相同由.week 访问器)优雅地从标量值
    猜你喜欢
    • 2023-01-29
    • 1970-01-01
    • 2019-02-04
    • 2016-07-02
    • 2020-09-26
    • 1970-01-01
    • 2016-01-11
    • 2011-02-19
    • 2013-03-14
    相关资源
    最近更新 更多