asfreq дает неожиданные результаты с периодом dtype - PullRequest
1 голос
/ 03 апреля 2020

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

Учитывая следующий код:

import pandas as pd

p5h = pd.period_range(start='2020-02-01 00:00', end='2020-03-04 00:00', freq='5h', name='p5h')

df = pd.DataFrame({'Values' : 1}, index=p5h)

Я хотел бы повысить частоту до 1H, оставляя новые строки заполненными значениями NaN.

import numpy as np

df1h = df.asfreq('1H', method=None, how='start', fill_value = np.NaN)

Но вот что я получаю:

 df1h.head(7)

                   Values
 p5h                     
 2020-02-01 00:00       1
 2020-02-01 05:00       1
 2020-02-01 10:00       1
 2020-02-01 15:00       1
 2020-02-01 20:00       1
 2020-02-02 01:00       1
 2020-02-02 06:00       1

(необходимо для этого затем объединить / объединить / объединить этот DataFrame с другим имеющий «1H» PeriodIndex - эта операция слияния не может быть выполнена, если PeriodIndex обоих DataFrames не разделяет одну и ту же частоту)

Спасибо за любую помощь! Bests

1 Ответ

3 голосов
/ 03 апреля 2020

asfreq() действительно метод для Period dtypes. Обратите внимание, что ваш индекс имеет тип dtype:

df.index.dtype
# period[5H]

Однако его функциональность немного отличается, и он принимает только эти два параметра:

  • freqstr Желаемая частота.

  • how {'E', 'S', 'end', 'start'}, по умолчанию 'end' Start или конец временного интервала.


Что можно сделать для обработки Period index dtype, это использовать resample и просто агрегировать с first:

df.resample('1H').first()

                   Values
p5h                     
2020-02-01 00:00     1.0
2020-02-01 01:00     NaN
2020-02-01 02:00     NaN
2020-02-01 03:00     NaN
2020-02-01 04:00     NaN
...                  ...
2020-03-03 21:00     1.0
2020-03-03 22:00     NaN
2020-03-03 23:00     NaN
2020-03-04 00:00     NaN
2020-03-04 01:00     NaN

Хотя, если вы вместо этого определили индекс с помощью pd.date_range, вы получите, как и ожидалось:

p5h = pd.date_range(start='2020-02-01 00:00', end='2020-03-04 00:00', 
                    freq='5h', name='p5h')
df = pd.DataFrame({'Values' : 1}, index=p5h)

df.asfreq('1H')

                      Values
p5h                        
2020-02-01 00:00:00     1.0
2020-02-01 01:00:00     NaN
2020-02-01 02:00:00     NaN
2020-02-01 03:00:00     NaN
2020-02-01 04:00:00     NaN
...                     ...
2020-03-03 17:00:00     NaN
2020-03-03 18:00:00     NaN
2020-03-03 19:00:00     NaN
2020-03-03 20:00:00     NaN
2020-03-03 21:00:00     1.0
...