asfreq 使用 Period dtype 产生意想不到的结果

asfreq yields unexpected results with Period dtype

对 Dataframe 进行上采样时,我希望创建的新行留空。

考虑以下代码:

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

(然后需要 merge/join/concat 这个 DataFrame 到另一个具有 '1H' PeriodIndex 的 DataFrame - 如果两个 DataFrame 的 PeriodIndex 不共享相同的频率,则无法实现此合并操作)

感谢您的帮助!最佳

asfreq() is indeed a method for Period 数据类型。请注意,您的索引具有 dtype:

df.index.dtype
# period[5H]

但是,它的功能略有不同,它只需要这两个参数:

  • freqstr The desired frequency.

  • how {‘E’, ‘S’, ‘end’, ‘start’}, default ‘end’ Start or end of the timespan.


处理 Period 索引数据类型可以做的是使用 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