Фильтрация данных за несколько лет по диапазону дат по месяцам и дням в пандах - PullRequest
0 голосов
/ 06 октября 2019

У меня есть фрейм данных df в следующем формате для нескольких лет (6 часов).

Мне нужно отфильтровать даты за каждый год, только за период с 30 ноября по 30 марта.

      Dates               Col1   Col2
11178 2018-10-27 12:00:00  -1   -3
11179 2018-10-27 18:00:00  -2    2
11180 2018-10-28 00:00:00   1    8
11181 2018-10-28 06:00:00  0.1 -0.2
11182 2018-10-28 12:00:00  0.2 -0.1
11183 2018-10-28 18:00:00  0.2  0.03
11184 2018-10-29 00:00:00  0.3  0.07
11185 2018-10-29 06:00:00  0.2 -0.2
11186 2018-10-29 12:00:00  0.05 -0.4
11187 2018-10-29 18:00:00  0.02 -0.5
11188 2018-10-30 00:00:00  0.02 -0.6
11189 2018-10-30 06:00:00 -0.05 -0.7

Я могу удалить определенные дни или месяцы с помощью

df = df.loc[~(df['Dates'].dt.month.eq(4))]

, который в качестве примера удаляет апрель. Я просто не могу найти эффективный способ делать один и тот же диапазон дат для каждого года, поэтому я могу в конечном итоге сделать это итеративно, смещая период назад на день каждый раз.

Столбец даты в настоящее время находится вформат даты и времени.

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

представьте, что вы хотите выбрать только данные от 30 ноября до 30 марта :

, тогда вы можете разделить месяцы, которые вы выбрали полностью, и месяцы, из которыхВы выбираете только несколько дней:

1.Вы полностью выбираете: декабрь, январь и февраль.

Dcember_Jan_Feb=~df['Dates'].dt.month.between(3,11)

, выбранный 30 ноября, и вытакже выберите с 1 по 30 марта (в марте 31 день)

Nov_30=df['Dates'].dt.month.eq(11)&df['Dates'].dt.day.between(30,30)
March_1_to_30=df['Dates'].dt.month.eq(3)&df['Dates'].dt.day.between(1,30)

Наконец, примените фильтр:

df_filtered=df[Dcember_Jan_Feb|Nov_30|March_1_to_30]
0 голосов
/ 06 октября 2019

вот хитрый способ сделать это

df = pd.DataFrame([('11178', '2018-10-27 12:00:00', '-1', '-3'), ('11179', '2018-03-30 18:00:00', '-2', '2'), ('11180', '2018-10-28 00:00:00', '1', '8'), ('11181', '2018-10-28 06:00:00', '0.1', '-0.2'), ('11182', '2018-10-28 12:00:00', '0.2', '-0.1'), ('11183', '2018-10-28 18:00:00', '0.2', '0.03'), ('11184', '2018-4-29 00:00:00', '0.3', '0.07'), ('11185', '2018-9-29 06:00:00', '0.2', '-0.2'), ('11186', '2018-10-29 12:00:00', '0.05', '-0.4'), ('11187', '2018-10-29 18:00:00', '0.02', '-0.5'), ('11188', '2018-10-30 00:00:00', '0.02', '-0.6'), ('11189', '2018-10-30 06:00:00', '-0.05', '-0.7')], columns=('ID', 'Dates', 'Col1', 'Col2'))
df = df.set_index("ID")
df.Dates = pd.to_datetime(df.Dates)

df[~(df.Dates.dt.month*100 + df.Dates.dt.day).between(330, 930, inclusive=False)]

Описание

  • 100 * месяц + день преобразует дату в 3-значное число, например 330будет 30 марта, а 930 будет 30 сентября
  • вы хотите исключить даты между 330 и 930, поэтому мы используем оператор not для дат внутри него
...