我在"一个月的第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
希望能有所帮助。这是我的第一次贡献。