Python:如何找到一年中的第n个工作日



我在"一个月的第n个工作日"上看到了很多类似的帖子,但我的问题与"一年的第n次工作日"有关。

背景:我有一张表,里面有每天的销售数据。共有3列:日期、星期几(周一、周二、周三等(和销售额。我想将第一年的第n个工作日与第二年的第N个工作日进行匹配,并以此方式比较销售额。

  • 示例1:01/06/2021与01/04/2021比赛,都是当年的第一个星期一
  • 示例2:2019年2月11日与2020年10月31日的比赛,都是当年的第44个星期六

正如你所看到的,我不能简单地做"一个月的第n个工作日",因为有时匹配的第N个工作日会出现在不同的月份(如2019年2月11日和2020年10月31日所示(。

我在熊猫里操纵桌子。我想知道是否有一种快速的方法可以创建一列,帮助我计算"一年中的第n个工作日",以便以后可以根据该值进行匹配?

谢谢你的帮助。

pandas包具有一些不错的时间/日期功能。

例如

import pandas as pd
s = pd.date_range('2020-01-01', '2020-12-31', freq='D').to_series()
print(s.dt.dayofweek)

将工作日作为整数。

2020-01-01    2
2020-01-02    3
2020-01-03    4
2020-01-04    5
2020-01-05    6
2020-01-06    0
2020-01-07    1
2020-01-08    2
2020-01-09    3
2020-01-10    4

(星期一=0(

然后你可以做

mondays = s.dt.dayofweek.eq(0) 

如果你想找到一年中的第一个星期一使用。

print(mondays.idxmax())                                                    
Timestamp('2020-01-06 00:00:00', freq='D')

或第5个星期一:

n = 4                                                                           
print(s[mondays].iloc[n])                                                                
Timestamp('2020-02-03 00:00:00')

如果你的销售数据帧是df,那么为了比较两年前5个星期一的销售额,你可以这样做:

mondays = df['Date'].dt.dayofweek.eq(0)
mondays_in_y1 = (df['Year'] == 2019) & mondays
mondays_in_y2 = (df['Year'] == 2020) & mondays 
pd.DataFrame({
2019: df.loc[mondays_in_y1, 'Sales'].values[:5],
2020: df.loc[mondays_in_y2, 'Sales'].values[:5]
})

IIUC您可以从播放

import pandas as pd
import numpy as np
df = pd.DataFrame({"date":pd.date_range(start="2020-01-01",
end="2020-12-31")})
# weekday number Monday is 0
df["dow"] = df["date"].dt.weekday
# is weekday as int
df["is_weekday"] =  (df["dow"]<5).astype(int)
df["n"] = df["is_weekday"].cumsum()
# remove weekends
df["n"] = np.where(df["n"]==df["n"].shift(), np.nan, df["n"])
df[df["n"]==100]["date"]

编辑只有两行

df["n"] = (df["date"].dt.weekday<5).astype(int).cumsum()
df["n"] = np.where(df["n"]==df["n"].shift(), np.nan, df["n"])

您可以尝试使用dt.week。它返回一个序列,但您可以简单地用这些值定义一个新列。

例如:

import pandas as pd
rng = pd.date_range('2015-02-24', periods=5, freq='D')
df = pd.DataFrame({ 'Date': rng, 'Val' : np.random.randn(len(rng))})

输出:

Date        Val
0   2015-02-24  -0.977278
1   2015-02-25  0.950088
2   2015-02-26  -0.151357
3   2015-02-27  -0.103219
4   2015-02-28  0.410599

您应该输入df['Week_Number'] = df['Date'].dt.week,这样您将使用周号创建一个新列:

Date        Val     Week_Number
0   2015-02-24  -0.977278   9
1   2015-02-25   0.950088   9
2   2015-02-26  -0.151357   9
3   2015-02-27  -0.103219   9
4   2015-02-28   0.410599   9

希望能有所帮助。这是我的第一次贡献。

最新更新