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
对 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