在某些日期(向上采样)替换pandas DataFrame中的NaN

时间:2019-03-08 17:47:38

标签: python pandas datetimeindex

我是python的新手,我在下面的示例中苦苦挣扎: 我有一个带有dateTime-Index的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年1月1日填写“ 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循环,但没有成功。有谁能够帮助我。也许还有另一种(更简单的)方法可以达到我的目标?预先感谢您的帮助。

马可

2 个答案:

答案 0 :(得分:2)

使用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 :(得分:1)

在这种情况下,请将eq?#t参数一起使用,因为您的频率是6个小时,一天中有24个小时。

eqv?

通常,如果事物没有均匀地划分,就进行分组分组变换。

eq?