3 回答
TA贡献1810条经验 获得超4个赞
鉴于.week
跨两个不同日历年的那几周如何设置属性,我们需要一个与新年无关的分组函数。最简单的解决方案是假设您的数据中没有跳跃(您每天都有一行)并将其划分为 7 个块。
但这感觉真的很脆弱。相反,这里有一个实现会询问“本周的星期一是什么时候?” 和小组。
df.date.apply(lambda t: t - (t.dayofweek * pd.Timedelta('1 day')))
这是有效的,因为datetime
给定周星期一的确切值在每周之间都是唯一的。这是一个演示。
这当然假设您希望 2018 年 12 月 31 日与 2019 年 1 月 1 日在同一周(可以说,这是因为它属于同一周一至周日的切片,但正如 Idlehands 指出的那样,这是一个问题语义由您决定)。
TA贡献1818条经验 获得超8个赞
使用isocalendar()返回 atuple的(year, week, day):
df['m'] = df['date'].apply(lambda x: x.isocalendar()[:2]) # only need the year and week
# 0 (2018, 52)
# 1 (2018, 52)
# 2 (2018, 52)
# 3 (2019, 1)
# 4 (2019, 1)
# 5 (2019, 1)
# 6 (2019, 1)
# 7 (2019, 1)
要计算一周的开始,请减去dayofweek:
df['weekpy'] = df['date'].apply(lambda x: x - pd.Timedelta(days=x.dayofweek))
# 0 2018-12-24
# 1 2018-12-24
# 2 2018-12-24
# 3 2018-12-31
# 4 2018-12-31
# 5 2018-12-31
# 6 2018-12-31
# 7 2018-12-31
最终结果:
date week m weekpy
0 2018-12-28 52 (2018, 52) 2018-12-24
1 2018-12-29 52 (2018, 52) 2018-12-24
2 2018-12-30 52 (2018, 52) 2018-12-24
3 2018-12-31 1 (2019, 1) 2018-12-31
4 2019-01-01 1 (2019, 1) 2018-12-31
5 2019-01-02 1 (2019, 1) 2018-12-31
6 2019-01-03 1 (2019, 1) 2018-12-31
7 2019-01-04 1 (2019, 1) 2018-12-31
添加回答
举报