如何解决填充 Pandas 中缺失的每小时数据
我有一个包含每小时测量值的时间序列的数据框,其结构如下:name、time、output。对于每个名称,测量值或多或少来自相同的时间段。我正在尝试填写缺失的值,以便每天所有 24 小时都出现在 time 列中。
所以我期待这样的桌子:
name time output
x 2018-02-22 00:00:00 100
...
x 2018-02-22 23:00:00 200
x 2018-02-24 00:00:00 300
...
x 2018-02-24 23:00:00 300
y 2018-02-22 00:00:00 100
...
y 2018-02-22 23:00:00 200
y 2018-02-25 00:00:00 300
...
y 2018-02-25 23:00:00 300
为此,我按 name 分组,然后尝试应用自定义函数,在相应的数据框中添加缺失的时间戳。
def add_missing_hours(df):
start_date = df.time.iloc[0].date()
end_date = df.time.iloc[-1].date()
dates_range = pd.date_range(start_date,end_date,freq = '1H')
new_dates = set(dates_range) - set(df.time)
name = df["name"].iloc[0]
df = df.append(pd.DataFrame({'GSRN':[name]*len(new_dates),'time': new_dates}))
return df
出于某种原因,在创建 DataFrame 时删除了 name 列,但我不明白为什么。有谁知道为什么或有更好的想法如何填写缺失的时间戳?
编辑 1:
这与 [此处的问题][1] 不同,因为他们不需要所有 24 个值/天——在下午 2 点和晚上 10 点之间重新采样只会给出介于两者之间的值。
编辑 2:
通过创建一个包含所有名称时间戳对的多索引并与表结合,我找到了一个(不是很好)的解决方案。以下代码供任何有兴趣但仍对更好的解决方案感兴趣的人使用:
start_date = datetime.datetime.combine(df.time.min().date(),datetime.time(0,0))
end_date = datetime.datetime.combine(df.time.max().date(),datetime.time(23,0))
new_idx = pd.date_range(start_date,freq = '1H')
mux = pd.MultiIndex.from_product([df['name'].unique(),new_idx],names=('name','time'))
df_complete = pd.DataFrame(index=mux).reset_index().combine_first(df)
df_complete = df_complete.groupby(["name",df_complete.time.dt.date]).filter(lambda g: (g["output"].count() == 0))
解决方法
试试:
第一个创建从最小日期到最大日期的数据帧,以小时为间隔。然后将它们连接在一起。
df.time = pd.to_datetime(df.time)
min_date = df.time.min()
max_date = df.time.max()
dates_range = pd.date_range(min_date,max_date,freq = '1H')
df.set_index('time',inplace=True)
df3=pd.DataFrame(dates_range).set_index(0)
df4 = df3.join(df)
df4:
name output
2018-02-22 00:00:00 x 100.0
2018-02-22 00:00:00 y 100.0
2018-02-22 01:00:00 NaN NaN
2018-02-22 02:00:00 NaN NaN
2018-02-22 03:00:00 NaN NaN
... ... ...
2018-02-25 19:00:00 NaN NaN
2018-02-25 20:00:00 NaN NaN
2018-02-25 21:00:00 NaN NaN
2018-02-25 22:00:00 NaN NaN
2018-02-25 23:00:00 y 300.0
98 rows × 2 columns
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。