我有一个熊猫日期栏,我想返回上一个星期四的日期(可以是一周中的任何一天)。我使用pd.offsets.Week,但是当年份更改并且Week重新开始时,我没有得到预期的结果。这是我的数据框,为“ d”:
raw date Thursday week_start
0 2019-01-03 2018-12-27 2018-12-27
1 2019-01-03 2018-12-27 2018-12-27
2 2019-01-03 2018-12-27 2018-12-27
3 2019-01-02 2018-12-27 2018-12-27
4 2019-01-02 2018-12-27 2018-12-27
5 2019-01-02 2018-12-27 2018-12-27
6 2019-01-03 2019-01-03 2018-12-27
7 2019-01-03 2019-01-03 2018-12-27
8 2019-01-03 2019-01-03 2018-12-27
9 2019-01-03 2019-01-03 2018-12-27
10 2019-01-02 2018-12-27 2018-12-27
11 2019-01-02 2018-12-27 2018-12-27
12 2019-01-02 2018-12-27 2018-12-27
d['week_start'] = d['raw date'] - pd.offsets.Week(weekday=3)
我希望d ['week_start'] = 1/3/2019返回1/3/2019,而不是12/27/2018。我怀疑是因为1/3/2019的Week为0,所以它返回了该周的星期四。无论年份如何变化,如何获取上一个星期四的日期?
答案 0 :(得分:1)
您只能将Series.where
与Series.dt.weekday
一起使用,而不能更改rng = pd.date_range('2019-01-03', periods=20)
d = pd.DataFrame({'raw date': rng})
mask = d['raw date'].dt.weekday == 3
d['week_start'] = d['raw date'].where(mask, d['raw date'] - pd.offsets.Week(weekday=3))
print(d)
raw date week_start
0 2019-01-03 2019-01-03
1 2019-01-04 2019-01-03
2 2019-01-05 2019-01-03
3 2019-01-06 2019-01-03
4 2019-01-07 2019-01-03
5 2019-01-08 2019-01-03
6 2019-01-09 2019-01-03
7 2019-01-10 2019-01-10
8 2019-01-11 2019-01-10
9 2019-01-12 2019-01-10
10 2019-01-13 2019-01-10
11 2019-01-14 2019-01-10
12 2019-01-15 2019-01-10
13 2019-01-16 2019-01-10
14 2019-01-17 2019-01-17
15 2019-01-18 2019-01-17
16 2019-01-19 2019-01-17
17 2019-01-20 2019-01-17
18 2019-01-21 2019-01-17
19 2019-01-22 2019-01-17
值:
x1 = x1.view(-1, x1.shape[-1]) # from C-H-W-k -> CHW-K
x2 = x2.view(x2.shape[0], -1) # from N-C-H-W -> N-CHW
out = x2 @ x1 # matrix multiplication
答案 1 :(得分:0)
这可以使用pd.TimeDeltaIndex完成。
df [“ date”]。dt.dayofweek-3 + 7)将在下周四的星期四之前给出
df [“ date”]。dt.dayofweek-3 + 7)%7将在上周四之后的几天给出
date_range = pd.date_range('2019-9-20', periods=20)
df = pd.DataFrame({'date': date_range})
df["week_start"] = df["date"] - pd.TimedeltaIndex((df["date"].dt.dayofweek-3+7)%7, "D")
df
结果
date date dayofweek week_start week_start dayofweek
0 2019-09-20 4 2019-09-19 3
1 2019-09-21 5 2019-09-19 3
2 2019-09-22 6 2019-09-19 3
3 2019-09-23 0 2019-09-19 3
4 2019-09-24 1 2019-09-19 3
5 2019-09-25 2 2019-09-19 3
6 2019-09-26 3 2019-09-26 3
7 2019-09-27 4 2019-09-26 3
8 2019-09-28 5 2019-09-26 3
9 2019-09-29 6 2019-09-26 3
10 2019-09-30 0 2019-09-26 3
11 2019-10-01 1 2019-09-26 3
12 2019-10-02 2 2019-09-26 3
13 2019-10-03 3 2019-10-03 3
14 2019-10-04 4 2019-10-03 3
15 2019-10-05 5 2019-10-03 3
16 2019-10-06 6 2019-10-03 3
17 2019-10-07 0 2019-10-03 3
18 2019-10-08 1 2019-10-03 3
19 2019-10-09 2 2019-10-03 3