Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过'填写NaN;菲利';和';内插';取决于Python中NaN出现的时间_Python_Pandas_Datetime_Dataframe_Series - Fatal编程技术网

通过'填写NaN;菲利';和';内插';取决于Python中NaN出现的时间

通过'填写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应用“插值”。我的数据

我想使用“平均值”和“插值”在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应用“插值”。我的数据是从早上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相同的形状。
。无法复制,对我来说很好。看起来您无法将数据帧转换为我定义的格式。那很可能。