Python 在数据框中填写缺失的小时数
我有一个包含每小时数据的数据框:Python 在数据框中填写缺失的小时数,python,pandas,Python,Pandas,我有一个包含每小时数据的数据框: area date hour output H1 2018-07-01 07:00:00 150 H1 2018-07-01 08:00:00 150 H1 2018-07-01 09:00:00 100 H1 2018-07-01 11:00:00 150 H2 2018-07-01 09:00:00 100 H2 2018-
area date hour output
H1 2018-07-01 07:00:00 150
H1 2018-07-01 08:00:00 150
H1 2018-07-01 09:00:00 100
H1 2018-07-01 11:00:00 150
H2 2018-07-01 09:00:00 100
H2 2018-07-01 10:00:00 50
H2 2018-07-01 11:00:00 50
H2 2018-07-01 12:00:00 150
但数据只包含有输出时的小时数行,如何用输出0填充每个区域缺少的小时数?例如,为H1添加两行:
area date hour output
H1 2018-07-01 10:00:00 0
H1 2018-07-01 12:00:00 0
我可以假设所有区域的最小和最大小时是采样周期的开始和结束(在本例中为7:00:00和12:00:00)
现在,我正在为每个区域创建一个包含从7:00到12:00所有时间的数据框,然后将我的数据与该数据框合并,然后用0填充NaN。这非常慢,因为我的数据集可能有数百万行
有更好的方法吗?您可以使用
groupby
df['Datetime']=pd.to_datetime(df.date+' '+df.hour)# combine hour and date to datetime
df.drop(['date','hour'],inplace=True,axis = 1)# drop duplicate infomation
df.groupby('area').\
apply(lambda x : x.set_index('Datetime').resample('H').mean().fillna(0)).\
reset_index()
Out[662]:
area Datetime output
0 H1 2018-07-01 07:00:00 150.0
1 H1 2018-07-01 08:00:00 150.0
2 H1 2018-07-01 09:00:00 100.0
3 H1 2018-07-01 10:00:00 0.0
4 H1 2018-07-01 11:00:00 150.0
5 H2 2018-07-01 09:00:00 100.0
6 H2 2018-07-01 10:00:00 50.0
7 H2 2018-07-01 11:00:00 50.0
8 H2 2018-07-01 12:00:00 150.0
您可以创建一个最小和最大的日期范围,将数据框与现有数据框合并,并使用null填充值 df 输出: 只要源日期/时间是从 一个测量日 如果源包含不同日期的读数,则重新采样的结果 对于每个区域,从第一天最早的读数到最晚的读数 在最后一天阅读,包括夜间中间时间,是什么 可能不是你想要的 此解决方案的另一个缺点是它不提供“零”读数 从测量日开始,但从最早的读数开始。 这同样适用于“最终”阅读,也不一定是在文章末尾 测量日 我的解决方案没有这些缺点,基于以下假设:
import pandas as pd
df = pd.read_csv('Input.csv')
# Generate df_borders - NaN readings for start / end of each area / date
df_start = df[['area','date']].drop_duplicates()
df_end = df_start.copy()
df_start['hour'] = '07:00:00'
df_end['hour'] = '13:00:00'
df_borders = pd.concat([df_start,df_end])
# Compute Datetime column and drop hour column, for both DataFrames
df['Datetime'] = pd.to_datetime(df.date + ' ' + df.hour)
df.drop('hour', inplace=True, axis = 1)
df_borders['Datetime'] = pd.to_datetime(df_borders.date + ' ' + df_borders.hour)
df_borders.drop('hour', inplace=True, axis = 1)
# Add NaN readings
df = df.append(df_borders, sort=False, ignore_index=True)\
.drop_duplicates(subset=['area', 'Datetime'])
# Generate the full set of readings
df = df.groupby(['area', 'date'])\
.apply(lambda x : x.set_index('Datetime').resample('H').mean().fillna(0))\
.reset_index()
df.drop('date', inplace=True, axis = 1)
# Result
print(df)
有些部分是温家宝解决方案的副本,以避免重新发明轮子
对于源数据:
area,date,hour,output
H1,2018-07-01,07:00:00,150
H1,2018-07-01,08:00:00,120
H1,2018-07-01,09:00:00,90
H1,2018-07-01,11:00:00,130
H2,2018-07-01,09:00:00,110
H2,2018-07-01,10:00:00,50
H2,2018-07-01,11:00:00,80
H2,2018-07-01,12:00:00,110
H2,2018-07-02,08:00:00,40
H2,2018-07-02,09:00:00,65
H2,2018-07-02,11:00:00,95
H2,2018-07-02,12:00:00,45
它打印:
area Datetime output
0 H1 2018-07-01 07:00:00 150.0
1 H1 2018-07-01 08:00:00 120.0
2 H1 2018-07-01 09:00:00 90.0
3 H1 2018-07-01 10:00:00 0.0
4 H1 2018-07-01 11:00:00 130.0
5 H1 2018-07-01 12:00:00 0.0
6 H1 2018-07-01 13:00:00 0.0
7 H2 2018-07-01 07:00:00 0.0
8 H2 2018-07-01 08:00:00 0.0
9 H2 2018-07-01 09:00:00 110.0
10 H2 2018-07-01 10:00:00 50.0
11 H2 2018-07-01 11:00:00 80.0
12 H2 2018-07-01 12:00:00 110.0
13 H2 2018-07-01 13:00:00 0.0
14 H2 2018-07-02 07:00:00 0.0
15 H2 2018-07-02 08:00:00 40.0
16 H2 2018-07-02 09:00:00 65.0
17 H2 2018-07-02 10:00:00 0.0
18 H2 2018-07-02 11:00:00 95.0
19 H2 2018-07-02 12:00:00 45.0
20 H2 2018-07-02 13:00:00 0.0
根据需要,一系列7个读数,用于3个区域/日期对。您可以使用
df.fillna(0)
area,date,hour,output
H1,2018-07-01,07:00:00,150
H1,2018-07-01,08:00:00,120
H1,2018-07-01,09:00:00,90
H1,2018-07-01,11:00:00,130
H2,2018-07-01,09:00:00,110
H2,2018-07-01,10:00:00,50
H2,2018-07-01,11:00:00,80
H2,2018-07-01,12:00:00,110
H2,2018-07-02,08:00:00,40
H2,2018-07-02,09:00:00,65
H2,2018-07-02,11:00:00,95
H2,2018-07-02,12:00:00,45
area Datetime output
0 H1 2018-07-01 07:00:00 150.0
1 H1 2018-07-01 08:00:00 120.0
2 H1 2018-07-01 09:00:00 90.0
3 H1 2018-07-01 10:00:00 0.0
4 H1 2018-07-01 11:00:00 130.0
5 H1 2018-07-01 12:00:00 0.0
6 H1 2018-07-01 13:00:00 0.0
7 H2 2018-07-01 07:00:00 0.0
8 H2 2018-07-01 08:00:00 0.0
9 H2 2018-07-01 09:00:00 110.0
10 H2 2018-07-01 10:00:00 50.0
11 H2 2018-07-01 11:00:00 80.0
12 H2 2018-07-01 12:00:00 110.0
13 H2 2018-07-01 13:00:00 0.0
14 H2 2018-07-02 07:00:00 0.0
15 H2 2018-07-02 08:00:00 40.0
16 H2 2018-07-02 09:00:00 65.0
17 H2 2018-07-02 10:00:00 0.0
18 H2 2018-07-02 11:00:00 95.0
19 H2 2018-07-02 12:00:00 45.0
20 H2 2018-07-02 13:00:00 0.0