Python从pandas date列获取一周的前一天(在我的示例中为星期四)

时间:2019-09-22 03:43:15

标签: python pandas

我有一个熊猫日期栏,我想返回上一个星期四的日期(可以是一周中的任何一天)。我使用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,所以它返回了该周的星期四。无论年份如何变化,如何获取上一个星期四的日期?

2 个答案:

答案 0 :(得分:1)

您只能将Series.whereSeries.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