Как правильно сделать выборку дат в pandas.DatetimeIndex?
Нужна выборка по Date "неделя месяца", "день недели месяца" и "неделя квартала":
df = pd.read_csv('1.csv')
df.columns = ['Date', 'Change%']
Пример данных:
24-Jun-19 -0.52%
21-Jun-19 1.16%
20-Jun-19 4.25%
19-Jun-19 -0.51%
- "Неделя месяца" это 1-я неделя всех месяцев (1), затем 2-я неделя всех месяцев (2) итд.
- "День недели месяца" - понедельники всех месяцев (1), вторнки всех месяцев (2) итд (в файле даты с пн по пт).
- "Неделя квартала" - 1-я неделя кварталов (1), 2-я неделя кварталов (2) итп.
Как сделать день недели понятно, например:
df['dayofweek'] = pd.DatetimeIndex(df['Date']).dayofweek
или день итп. Но того, что хочется сделать в pandas.DatetimeIndex не вижу.
В итоге получаем строки цифрами к каждой дате.
Данные, которые использую для анализа.
Пример:
Date Change % Неделя месяца День недели месяца Неделя квартала
3-Jun-19 -4.98% 1 1 6
4-Jun-19 1.13% 1 2 6
5-Jun-19 -2.16% 1 3 6
6-Jun-19 1.72% 1 4 6
7-Jun-19 2.63% 1 5 6
10-Jun-19 -1.58% 2 1 10
11-Jul-19 0.00% 2 7 10
12-Jul-19 -3.72% 2 8 10
13-Jul-19 2.23% 2 9 10
14-Jul-19 1.14% 2 10 10
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Реализовал то, что смог понять из комментариев, а именно "Неделя_месяца" и "День_недели_месяца" (наименования столбцов от автора вопроса).
df = pd.read_csv('1.csv', parse_dates=[0])
df.columns = ['Date', 'Change%']
df["Неделя_месяца"] = (df["Date"].dt.day - 1) // 7 + 1
# в январе обозначили как 1-5, в феврале 6-10, март 11-15, 15-20, 20-25
# и тп – пн-вт-ср-чт-пт
df["День_недели_месяца"] = (df["Date"].dt.weekday + 1) % 5 + 5*(df["Date"].dt.month-1)
результат:
In [220]: df
Out[220]:
Date Change% Неделя месяца День недели месяца Неделя квартала Неделя_месяца День_недели_месяца
0 2019-06-03 -4.98% 1 1 6 1 26
1 2019-06-04 1.13% 1 2 6 1 27
2 2019-06-05 -2.16% 1 3 6 1 28
3 2019-06-06 1.72% 1 4 6 1 29
4 2019-06-07 2.63% 1 5 6 1 25
5 2019-06-10 -1.58% 2 1 10 2 26
6 2019-07-11 0.00% 2 7 10 2 34
7 2019-07-12 -3.72% 2 8 10 2 30
8 2019-07-13 2.23% 2 9 10 2 31
9 2019-07-14 1.14% 2 10 10 2 32