Python:替换时间序列中缺少的值
我目前正在处理来自不同气象站的气象数据。不幸的是,有时会丢失数据。我编写了一个例程,将来自所有站点的数据合并到一个数据帧中,并实现了一个“NaN_Flag”列,该列显示某个时间点丢失的数据 现在的计划是用附近台站的数据填补这些数据空白。对于温度和湿度,插值是可能的,但取决于间隙的大小并不理想。 对于降雨事件,插值没有任何意义 第一列是包含日期、时间和位置的索引列。现在,我正在寻找一种解决方案,如果“NaN_标志”显示“1”,则填写另一个位置(同时)的测量数据 因此,在下面的简化示例中,我希望01-01-01 00:20:00位置1的数据集 自动替换为定位2的相同日期时间的数据。所以每个位置都有一个“备份”位置,每次“NaN_标志”显示“1”数据时,都会自动用相应的备份数据替换。 有人知道如何做到这一点吗Python:替换时间序列中缺少的值,python,python-3.x,pandas,datetime,time-series,Python,Python 3.x,Pandas,Datetime,Time Series,我目前正在处理来自不同气象站的气象数据。不幸的是,有时会丢失数据。我编写了一个例程,将来自所有站点的数据合并到一个数据帧中,并实现了一个“NaN_Flag”列,该列显示某个时间点丢失的数据 现在的计划是用附近台站的数据填补这些数据空白。对于温度和湿度,插值是可能的,但取决于间隙的大小并不理想。 对于降雨事件,插值没有任何意义 第一列是包含日期、时间和位置的索引列。现在,我正在寻找一种解决方案,如果“NaN_标志”显示“1”,则填写另一个位置(同时)的测量数据 因此,在下面的简化示例中,我希望01
DATETIME_UTC_LOCATION DATETIME_UTC LOCATION TEMP PLUV HUM NaN_FLAG
2020-01-01 00:00:00 Location1 2020-01-01 00:00:00 Location1 5.25 0.0 87.3 0
2020-01-01 00:10:00 Location1 2020-01-01 00:10:00 Location1 6.12 0.1 85.0 0
2020-01-01 00:20:00 Location1 2020-01-01 00:20:00 Location1 1
2020-01-01 00:00:00 Location2 2020-01-01 00:00:00 Location2 5.12 0.0 88.9 0
2020-01-01 00:10:00 Location2 2020-01-01 00:10:00 Location2 6.25 0.1 84.3 0
2020-01-01 00:20:00 Location2 2020-01-01 00:20:00 Location2 6.75 0.2 82.5 0
如果您拥有的数据帧具有与此数据帧等效的格式:
import pandas as pd
import numpy as np
df = pd.DataFrame(data={'month': ["Jan","Feb","Mar","Jan","Feb","Mar"],
'station': ["station_1","station_1","station_1","station_2","station_2","station_2"],
'values': [3.2, np.nan, 4.1, 3.6, 5.8, 4.2]}).set_index('month')
输出:
station values
month
Jan station_1 3.2
Feb station_1 NaN
Mar station_1 4.1
Jan station_2 3.6
Feb station_2 5.8
Mar station_2 4.2
您可以使用:
df.loc[df['station'] == "station_1"] = df.loc[df['station'] == "station_1"].fillna(df.loc[df['station'] == "station_2"])
用桩号1的NaN值替换桩号2的等效值。我所说的“等价”是指“月”指数中的匹配
输出:
station values
month
Jan station_1 3.2
Feb station_1 5.8
Mar station_1 4.1
Jan station_2 3.6
Feb station_2 5.8
Mar station_2 4.2
如果您拥有的数据帧具有与此数据帧等效的格式:
import pandas as pd
import numpy as np
df = pd.DataFrame(data={'month': ["Jan","Feb","Mar","Jan","Feb","Mar"],
'station': ["station_1","station_1","station_1","station_2","station_2","station_2"],
'values': [3.2, np.nan, 4.1, 3.6, 5.8, 4.2]}).set_index('month')
输出:
station values
month
Jan station_1 3.2
Feb station_1 NaN
Mar station_1 4.1
Jan station_2 3.6
Feb station_2 5.8
Mar station_2 4.2
您可以使用:
df.loc[df['station'] == "station_1"] = df.loc[df['station'] == "station_1"].fillna(df.loc[df['station'] == "station_2"])
用桩号1的NaN值替换桩号2的等效值。我所说的“等价”是指“月”指数中的匹配
输出:
station values
month
Jan station_1 3.2
Feb station_1 5.8
Mar station_1 4.1
Jan station_2 3.6
Feb station_2 5.8
Mar station_2 4.2
从科学的角度来看,你不认为调整附近站点的值会引入统计偏差吗?或者问另一个问题:为什么将缺失的值保留为NaN不是一个选项?关于统计偏差,你肯定是对的。但问题是,我正在将这些数据输入不同的疾病模拟模型,其中一些模型无法处理超过一小时的间隙,只能停止运行。因此,引入偏差问题较少。此外,我还有两个气象站位于同一位置的位置,还有额外的算法生成的数据,这些数据可以或多或少地作为可靠的备份。从科学的角度来看,你不认为调整附近站的值会引入统计偏差吗?或者问另一个问题:为什么将缺失的值保留为NaN不是一个选项?关于统计偏差,你肯定是对的。但问题是,我正在将这些数据输入不同的疾病模拟模型,其中一些模型无法处理超过一小时的间隙,只能停止运行。因此,引入偏差问题较少。此外,我还有两个气象站在同一位置的位置,还有额外的算法生成的数据,可以作为或多或少的可靠备份。非常感谢。目前,所有不同的位置都在同一个csv/数据帧中。但如果没有其他选择,分裂就不会成为问题。当前索引是datetime\u location。如果我为每个位置创建一个dataframe,其中datetime是索引,并在替换缺少的数据后插入location列,那么您的解决方案就会起作用。无论如何,如果有人想出了一个方法,使它在合并的数据框架内工作,我会更喜欢。啊,好吧,我相信我理解。在这种情况下,您可以用一列中的NaN值替换另一列中的值,如下所示:df.column_with_nans.fillna(df.column_second_station,inplace=True),其中,正如名称所说,“column_with_nans”是缺少值的列的名称,“column_second_station”是包含附近站点值的列。不抱歉,可能我解释错了。正如您在我的示例dataframe中看到的。日期时间、位置、温度、湿度……在不同的列中,不同位置的时间序列在不同的行中。是的,你完全正确,我编辑了我的答案,因此没有必要使用(有点长的)单行线创建新的数据帧,现在让我知道它是否有意义。很抱歉,答复太晚了……我无法更早地到达它。是的,它似乎工作得很好。非常感谢你!非常感谢你。目前,所有不同的位置都在同一个csv/数据帧中。但如果没有其他选择,分裂就不会成为问题。当前索引是datetime\u location。如果我为每个位置创建一个dataframe,其中datetime是索引,并在替换缺少的数据后插入location列,那么您的解决方案就会起作用。无论如何,如果有人想出了一个方法,使它在合并的数据框架内工作,我会更喜欢。啊,好吧,我相信我理解。在这种情况下,您可以用一列中的NaN值替换另一列中的值,如下所示:df.column_with_nans.fillna(df.column_second_station,inplace=True),其中,正如名称所说,“column_with_nans”是缺少值的列的名称,“column_second_station”是包含附近站点值的列。不抱歉,可能我解释错了。正如您在我的示例dataframe中看到的。日期时间、位置、温度、湿度……在不同的列中,不同位置的时间序列在不同的行中。是的,你完全正确,我编辑了我的答案,因此没有必要使用(有点长的)单行线创建新的数据帧,现在让我知道它是否有意义。很抱歉,答复太晚了……我无法更早地到达它。是的,它似乎工作得很好。非常感谢你!