Pandas: ошибка передискретизации данных для первого периода - PullRequest
3 голосов
/ 07 марта 2020

У меня есть серия суточных метеоданных, и я хотел бы заменить каждое суточное значение на среднее значение для месяца, к которому относится день. Чтобы достичь этого, я хочу сначала уменьшить частоту данных до среднемесячного значения, снова увеличить частоту до дневной. Все это с использованием Pandas 1.0.1.

Кадр данных выглядит следующим образом:

dframe = 
2001-01-01  23.00000
2001-01-02  19.18034
2001-01-03  9.18034
2001-01-04  0.00000
2001-01-05  0.00000
2001-01-06  0.00000
2001-01-07  0.00000
2001-01-08  0.00000
2001-01-09  9.18034
2001-01-10  19.18034
2001-02-01  20.18034
2001-02-02  10.18034
2001-02-03  0.00000
2001-02-04  0.00000
2001-02-05  0.00000
2001-02-06  0.00000
2001-02-07  0.00000
2001-02-08  10.18034
2001-02-09  20.18034
2001-02-10  24.00000

После понижающей дискретизации все выглядит хорошо (значения могут не совпадать, это фиктивные числа):

means = dframe.resample(rule = 'M').mean()

means = 
2001-01-31   8.456906
2001-02-28   7.499419

Но последующее повышение частоты дискретизации не работает так, как мне бы хотелось:

segmented = means.resample(rule = 'D').bfill()

segmented = 
2001-01-31   8.456906
2001-02-01   7.499419
2001-02-02   7.499419
2001-02-03   7.499419
2001-02-04   7.499419
...               ...

Первый период (январь 2001 года) не подвергался повышению частоты, а второй -.

Я перепробовал все комбинации с аргументами closed и label и loffset и с bfill() и ffill(), но безрезультатно; иногда первый месяц ошибается, а иногда - последний, но всегда неправильный.

Помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 07 марта 2020

Это работает:

pd.Series(
    [1,2,3,4],index=pd.date_range('2018-01-30', periods=4, freq='D')
).resample(rule = 'M').transform(lambda x: x.mean())

Эта проблема с вашим подходом состоит в том, что когда вы сделали means, диапазон индексов больше не включает все даты, которые вы изначально имели. transform (или apply) - это хороший способ вернуть столько же строк, сколько вы вставили.

2 голосов
/ 07 марта 2020

Может быть, вы можете использовать groupby, используя pd.Grouper, чтобы делать это в месяц, и tranform, например:

segmented = dframe.groupby(pd.Grouper(level=0, freq='M')).transform('mean')

при условии, что даты в индексе, вы бы иметь все даты от dframe и среднее значение за месяц, связанное с каждой из них

0 голосов
/ 07 марта 2020

Спасибо, оба ответа работают отлично.

"Эта проблема с вашим подходом заключается в том, что когда вы составляли средства, диапазон индексов больше не включает все даты, которые у вас изначально были"

Я подозревал что-то подобное, но я не знал, как это преодолеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...