在特定日期替换 pandas DataFrame 中的 NaN(上采样)

Replace NaN in pandas DataFrame at certain dates (upsampling)

我是 python 的新手,我正在努力处理以下示例: 我有一个带有日期时间索引的 pandas 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

但现在我想为所有 2018-01-01 填写例如 'Neujahrstag',而不仅仅是第一项。结果应如下所示(不仅针对 'Neujahrstag',而且针对 mit DataFrame 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 循环尝试过,但没有成功。有谁能够帮助我。也许还有其他(更简单)的方法可以达到我的目标?预先感谢您的帮助。

马可

使用 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

在这种特殊情况下,使用 .ffilllimit 参数,因为您的频率是 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
#...

一般情况下,如果分的不均,可以groupby变换。

df = df.resample('6H').asfreq()
df.groupby(df.index.date).transform('first')