Python: Как найти n-й будний год в году? - PullRequest
4 голосов
/ 08 апреля 2020

Я видел много похожих постов в "n-й день недели месяца", но мой вопрос касается "n-го дня недели".

Справочная информация. У меня есть таблица с ежедневными данными о продажах. Есть 3 столбца: дата, день недели (понедельник, вторник, ср. И т. Д. c) и продажи. Я бы хотел сопоставить n-й рабочий день года с годом 2 и сравнить продажи таким образом.

  • Пример 1: 01/06/2020 совпадает с 01/04/2021, оба являются 1-м понедельником того года.
  • Пример 2: 02.11.2009 совпадает с 31.10.2020, оба являются 44-й субботой этого года.

Как вы можете видеть, я не могу просто сделать «n-й день недели МЕСЯЦА», потому что иногда совпадающий n-й день недели выпадает в разные месяцы (как видно из 02/02/2019 и 10). / 31/2020).

Я манипулирую таблицей в pandas. Мне интересно, есть ли быстрый способ для меня создать столбец, который поможет мне рассчитать для меня " n-й день недели ", чтобы позже я мог сопоставить на основе этого значения?

Спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Пакет 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]
})
1 голос
/ 08 апреля 2020

IIU C вы можете играть с

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"])
0 голосов
/ 08 апреля 2020

Вы можете попробовать использовать 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

Надеюсь, это поможет. Это мой первый вклад.

...