Вперед заполнить столбец через год после последнего наблюдения - PullRequest
1 голос
/ 24 апреля 2020

Я пересылаю значения заполнения в следующем df, используя:

df = (df.resample('d') # ensure data is daily time series
 .ffill()
 .sort_index(ascending=True)) 

df before forward fill

id                 a          b          c          d
datadate                                              
1980-01-31        NaN        NaN        NaN        NaN
1980-02-29        NaN         2         NaN        NaN
1980-03-31        NaN        NaN        NaN        NaN
1980-04-30         1         NaN         3          4
1980-05-31        NaN        NaN        NaN        NaN
              ...        ...        ...        ...
2019-08-31        NaN        NaN        NaN        NaN
2019-09-30        NaN        NaN        NaN        NaN
2019-10-31        NaN        NaN        NaN        NaN
2019-11-30        NaN        NaN        NaN        NaN
2019-12-31        NaN        NaN        20         33

Однако, я sh буду пересылать заполнение только через год после (дата дата-время) последнее наблюдение, а затем оставшиеся строки просто будут NaN. Я не уверен, как лучше всего ввести этот критерий в эту задачу. Любая помощь будет супер!

Спасибо

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Если я вас правильно понимаю, вы хотите заполнить значения на De c 31, 2019 до следующего года. Попробуйте это:

end_date = df.index.max()
new_end_date = end_date + pd.offsets.DateOffset(years=1)
new_index = df.index.append(pd.date_range(end_date, new_end_date, closed='right'))

df = df.reindex(new_index)
df.loc[end_date:, :] = df.loc[end_date:, :].ffill()

Результат:

              a    b     c     d
1980-01-31  NaN  NaN   NaN   NaN
1980-02-29  NaN  2.0   NaN   NaN
1980-03-31  NaN  NaN   NaN   NaN
1980-04-30  1.0  NaN   3.0   4.0
1980-05-31  NaN  NaN   NaN   NaN
2019-08-31  NaN  NaN   NaN   NaN
2019-09-30  NaN  NaN   NaN   NaN
2019-10-31  NaN  NaN   NaN   NaN
2019-11-30  NaN  NaN   NaN   NaN
2019-12-31  NaN  NaN  20.0  33.0
2020-01-01  NaN  NaN  20.0  33.0
2020-01-02  NaN  NaN  20.0  33.0
...
2020-12-31  NaN  NaN  20.0  33.0
0 голосов
/ 24 апреля 2020

Одним из решений является перенаправление заполнения с использованием параметра limit, но это не будет обрабатывать високосный год:

df.fillna(mehotd='ffill', limit=365)

Второе решение заключается в определении более надежной функции для выполнения прямого заполнения в 1. -годное окно:

from pandas.tseries.offsets import DateOffsets

def fun(serie_df):
    serie = serie_df.copy()
    indexes = serie[~serie.isnull()].index

    for idx in indexes:
        mask = (serie.index >= idx) & (serie.index < idx+DateOffset(years=1))
        serie.loc[mask] =  serie[mask].fillna(method='ffill')
    return serie

df_filled = df.apply(fun, axis=0)

Если столбец имеет несколько значений, отличных от нан, в одном и том же 1-летнем окне, то первая заливка будет остановлена ​​при обнаружении самого последнего значения. Второе решение будет обрабатывать последовательные значения, как если бы они были независимыми.

...