Заменить NaN в пандах DataFrame в определенные даты (повышенная выборка) - PullRequest
1 голос
/ 08 марта 2019

Я новичок в python и борюсь со следующим примером: У меня есть пандас DataFrame с указателем даты и времени и столбец с праздниками. Это в ежедневном разрешении.

import pandas as pd
import holidays

hd = holidays.Switzerland(years=[2018])
f = pd.DataFrame(hd.items())
f.columns = ['date', 'feastday']
f['date'] = pd.to_datetime(f['date'])
f = f.set_index('date')

Это выглядит так:

date                feastday        
2018-01-01      Neujahrestag
2018-04-01            Ostern
2018-03-30        Karfreitag
2018-04-02       Ostermontag
2018-05-10          Auffahrt
2018-05-20         Pfingsten
2018-05-21     Pfingstmontag
2018-08-01  Nationalfeiertag
2018-12-25       Weihnachten

Теперь мне нужны данные не в суточном разрешении, а, например, в разрешении 6H:

f1 = f.resample('6H').asfreq()

Это работает, как я хотел, и приводит к:

date                     feastday        
2018-01-01 00:00:00  Neujahrestag
2018-01-01 06:00:00           NaN
2018-01-01 12:00:00           NaN
2018-01-01 18:00:00           NaN
2018-01-02 00:00:00           NaN
2018-01-02 06:00:00           NaN
2018-01-02 12:00:00           NaN

Но теперь я хочу заполнить, например, «Neujahrstag» для всех 2018-01-01, а не только для первого элемента. Результат должен выглядеть следующим образом (не только для Neujahrstag, но и для всех элементов в mitFrame f). Все предметы с одинаковой датой должны иметь одинаковое значение в праздник. Время на эту дату не имеет значения:

 date                     feastday        
2018-01-01 00:00:00  Neujahrestag
2018-01-01 06:00:00  Neujahrestag
2018-01-01 12:00:00  Neujahrestag
2018-01-01 18:00:00  Neujahrestag
2018-01-02 00:00:00           NaN
2018-01-02 06:00:00           NaN
2018-01-02 12:00:00           NaN

Я могу заменить один предмет вручную:

f1['2018-01-01'] = f1['2018-01-01']['feastday'][0]

Это работает без проблем, но я не запускаю материал автоматически для всех данных ... Я попробовал это с циклом for, но у меня ничего не получилось. Кто-нибудь может мне помочь. Может быть, есть и другой (более простой) способ достичь моей цели? Заранее благодарим за помощь.

Marco

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Группировка по дням с шаблоном df.groupby(df.index.day) - это один из способов сделать это:

f1 = f.resample('6H').asfreq()
res = f1.groupby(f1.index.day).ffill()[['feastday']]
res.head(7)
                         feastday
date
2018-01-01 00:00:00  Neujahrestag
2018-01-01 06:00:00  Neujahrestag
2018-01-01 12:00:00  Neujahrestag
2018-01-01 18:00:00  Neujahrestag
2018-01-02 00:00:00           NaN
2018-01-02 06:00:00           NaN
2018-01-02 12:00:00           NaN
1 голос
/ 08 марта 2019

В этом конкретном случае используйте .ffill с аргументом limit, так как ваша частота равна 6 часам, а день - 24 часа.

df.resample('6H').ffill(limit=3)

#                         feastday
#date                             
#2018-01-01 00:00:00  Neujahrestag
#2018-01-01 06:00:00  Neujahrestag
#2018-01-01 12:00:00  Neujahrestag
#2018-01-01 18:00:00  Neujahrestag
#2018-01-02 00:00:00           NaN
#2018-01-02 06:00:00           NaN
#2018-01-02 12:00:00           NaN
#...

В общем, преобразование группового преобразования может происходить, если все делится неравномерно.

df = df.resample('6H').asfreq()
df.groupby(df.index.date).transform('first')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...