通过'填写NaN;菲利';和';内插';取决于Python中NaN出现的时间
我想使用“平均值”和“插值”在df中填充NaN,具体取决于NaN发生的时间。如下图所示,第一次NaN发生在早上6点,第二次NaN发生在早上8点通过'填写NaN;菲利';和';内插';取决于Python中NaN出现的时间,python,pandas,datetime,dataframe,series,Python,Pandas,Datetime,Dataframe,Series,我想使用“平均值”和“插值”在df中填充NaN,具体取决于NaN发生的时间。如下图所示,第一次NaN发生在早上6点,第二次NaN发生在早上8点 02/03/2016 05:00 8 02/03/2016 06:00 NaN 02/03/2016 07:00 1 02/03/2016 08:00 NaN 02/03/2016 09:00 3 我的df由数千天组成。我想对上午7点之前发生的任何NaN应用“ffill”,并对上午7点之后发生的NaN应用“插值”。我的数据
02/03/2016 05:00 8
02/03/2016 06:00 NaN
02/03/2016 07:00 1
02/03/2016 08:00 NaN
02/03/2016 09:00 3
我的df由数千天组成。我想对上午7点之前发生的任何NaN应用“ffill”,并对上午7点之后发生的NaN应用“插值”。我的数据是从早上6点到下午6点
我的尝试是:
df_imputed = (df.between_time("00:00:00", "07:00:00", include_start=True, include_end=False)).ffill()
df_imputed = (df.between_time("07:00:00", "18:00:00", include_start=True, include_end=True)).interpolate()
但它将我的df减少到指定的时间段,而不是像我希望的那样填充NaN
编辑:我的df包含大约400列,因此该过程将应用于所有列。原始问题:单个系列的值
您可以根据您的条件定义布尔级数,然后或根据需要通过以下方式定义:
更新问题:多系列值 对于多个值列,可以使用和调整上述解决方案。或者,您可以使用或其他方式(例如)选择列,而不是
iloc
:
# setup
df = pd.DataFrame({'date': ['02/03/2016 05:00', '02/03/2016 06:00', '02/03/2016 07:00',
'02/03/2016 08:00', '02/03/2016 09:00'],
'value': [8, np.nan, 1, np.nan, 3],
'value2': [3, np.nan, 2, np.nan, 6]})
df['date'] = pd.to_datetime(df['date'])
# construct Boolean switch series
switch = (df['date'] - df['date'].dt.normalize()) > pd.to_timedelta('07:00:00')
# use numpy.where to differentiate between two scenarios
df.iloc[:, 1:] = df.iloc[:, 1:].interpolate().where(switch, df.iloc[:, 1:].ffill())
print(df)
date value value2
0 2016-02-03 05:00:00 8.0 3.0
1 2016-02-03 06:00:00 8.0 3.0
2 2016-02-03 07:00:00 1.0 2.0
3 2016-02-03 08:00:00 2.0 4.0
4 2016-02-03 09:00:00 3.0 6.0
原始问题:单个系列的值
您可以根据您的条件定义布尔级数,然后或根据需要通过以下方式定义:
更新问题:多系列值 对于多个值列,可以使用和调整上述解决方案。或者,您可以使用或其他方式(例如)选择列,而不是
iloc
:
# setup
df = pd.DataFrame({'date': ['02/03/2016 05:00', '02/03/2016 06:00', '02/03/2016 07:00',
'02/03/2016 08:00', '02/03/2016 09:00'],
'value': [8, np.nan, 1, np.nan, 3],
'value2': [3, np.nan, 2, np.nan, 6]})
df['date'] = pd.to_datetime(df['date'])
# construct Boolean switch series
switch = (df['date'] - df['date'].dt.normalize()) > pd.to_timedelta('07:00:00')
# use numpy.where to differentiate between two scenarios
df.iloc[:, 1:] = df.iloc[:, 1:].interpolate().where(switch, df.iloc[:, 1:].ffill())
print(df)
date value value2
0 2016-02-03 05:00:00 8.0 3.0
1 2016-02-03 06:00:00 8.0 3.0
2 2016-02-03 07:00:00 1.0 2.0
3 2016-02-03 08:00:00 2.0 4.0
4 2016-02-03 09:00:00 3.0 6.0
谢谢你的有用提示。我可以将其用于一列df。但是,我忘了写我的df有很多列。请查看我的编辑。如果列'date'设置为索引,该如何设置?使用
df.index
或通过df.reset\u index()
升级到列。抱歉,首先它拒绝'dt',然后它给出ValueError:数组条件必须与self相同的形状。
。无法复制,对我来说很好。看起来您无法将数据帧转换为我定义的格式。很可能。谢谢你的有用提示。我可以将其用于一列df。但是,我忘了写我的df有很多列。请查看我的编辑。如果列'date'设置为索引,该如何设置?使用df.index
或通过df.reset\u index()
升级到列。抱歉,首先它拒绝'dt',然后它给出ValueError:数组条件必须与self相同的形状。
。无法复制,对我来说很好。看起来您无法将数据帧转换为我定义的格式。那很可能。