我正在尝试对时间序列数据df
进行插值,如下所示:
id data lat notes analysis_date
0 17358709 NaN 26.125979 None 2019-09-20 12:00:00+00:00
1 17358709 NaN 26.125979 None 2019-09-20 12:00:00+00:00
2 17352742 -2.331365 26.125979 None 2019-09-20 12:00:00+00:00
3 17358709 -4.424366 26.125979 None 2019-09-20 12:00:00+00:00
我尝试:df.groupby(['lat', 'lon']).apply(lambda group: group.interpolate(method='linear'))
,它抛出{ValueError}Invalid fill method. Expecting pad (ffill) or backfill (bfill). Got linear
我怀疑问题出在我有None
个值,我不想对它们进行插值。解决办法是什么?
df.dtypes
给我:
id int64
data float64
lat float64
notes object
analysis_date datetime64[ns, psycopg2.tz.FixedOffsetTimezone...
dtype: object
答案 0 :(得分:1)
DataFrame.interpolate
的时区感知datetime64ns列存在问题,这会导致该错误消息非常隐秘。例如
import pandas as pd
df = pd.DataFrame({'time': pd.to_datetime(['2010', '2011', 'foo', '2012', '2013'],
errors='coerce')})
df['time'] = df.time.dt.tz_localize('UTC').dt.tz_convert('Asia/Kolkata')
df.interpolate()
ValueError:无效的填充方法。期待垫(填充)或回填 (填充)。线性
在这种情况下,不需要对该列进行插值,因此只需对所需的列进行插值。我们仍然希望DataFrame.interpolate
,所以请选择[[ ]]
(Series.interpolate
会导致一些奇怪的重塑)
df['data'] = df.groupby(['lat', 'lon']).apply(lambda x: x[['data']].interpolate())