我希望创建一个DataFrame,其中每行为一天,列提供日期、小时数据和当天数据的最大值和最小值。下面是一个例子(我在问题的后面提供了输入数据(:
Date_time 00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00 09:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 21:00 22:00 23:00 Max Min
0 2019-02-03 18.6 18.6 18.2 18.0 18.0 18.3 18.7 20.1 21.7 23.3 23.7 24.6 25.1 24.5 23.9 19.6 19.2 19.8 19.6 19.3 19.2 19.3 18.8 19.0 25.7 17.9
1 2019-02-04 18.9 18.8 18.6 18.4 18.7 18.8 19.0 19.7 21.4 23.5 25.8 25.4 22.1 21.8 21.0 18.9 18.8 18.9 18.8 18.8 18.9 27.8 18.1
我的输入DataFrame每小时有一行,其中包含日期&每小时的时间、平均值、最大值和最小值作为其列。
我希望在输入DataFrame中迭代每一天,并执行以下操作:
- 检查一天中每小时是否有一行
- 检查是否有一天中每小时的最大和最小数据
如果满足上述条件,我希望:
- 在给定日期的输出DataFrame中添加一行
- 使用日期填充行的"date_time"单元格
- 将小时数据转换为小时单元格
- 查找每小时最大数据的最大值,并使用它填充行的最大单元格
- 查找每小时最小值数据的最小值,并使用它填充该行的最小值单元格
每日输入数据示例如下。
示例1
全天可用
最大&每小时可用的最小值
继续在输出DataFrame 中创建行
Date_time Mean_temp Max_temp Min_temp 0 2019-02-03 00:00:00 18.6 18.7 18.5 1 2019-02-03 01:00:00 18.6 18.7 18.5 2 2019-02-03 02:00:00 18.2 18.5 18.0 3 2019-02-03 03:00:00 18.0 18.0 17.9 4 2019-02-03 04:00:00 18.0 18.1 17.9 5 2019-02-03 05:00:00 18.3 18.4 18.1 6 2019-02-03 06:00:00 18.7 19.1 18.4 7 2019-02-03 07:00:00 20.1 21.3 19.1 8 2019-02-03 08:00:00 21.7 22.9 21.0 9 2019-02-03 09:00:00 23.2 23.9 22.8 10 2019-02-03 10:00:00 23.7 24.1 23.3 11 2019-02-03 11:00:00 24.6 25.5 24.0 12 2019-02-03 12:00:00 25.1 25.7 24.7 13 2019-02-03 13:00:00 24.5 25.0 24.2 14 2019-02-03 14:00:00 23.9 25.3 21.2 15 2019-02-03 15:00:00 19.6 21.2 18.8 16 2019-02-03 16:00:00 19.2 19.5 18.7 17 2019-02-03 17:00:00 19.8 19.9 19.4 18 2019-02-03 18:00:00 19.6 19.8 19.5 19 2019-02-03 19:00:00 19.3 19.4 19.1 20 2019-02-03 20:00:00 19.2 19.4 19.1 21 2019-02-03 21:00:00 19.3 19.4 18.9 22 2019-02-03 22:00:00 18.8 19.0 18.7 23 2019-02-03 23:00:00 19.0 19.1 18.9
示例2
全天可用
最大&每小时可用的最小值
某些Mean_temp条目的NaN值
继续在输出DataFrame 中创建行
Date_time Mean_temp Max_temp Min_temp 24 2019-02-04 00:00:00 18.9 19.0 18.9 25 2019-02-04 01:00:00 18.8 18.9 18.7 26 2019-02-04 02:00:00 18.6 18.8 18.4 27 2019-02-04 03:00:00 18.4 18.6 18.1 28 2019-02-04 04:00:00 18.7 18.9 18.4 29 2019-02-04 05:00:00 18.8 18.8 18.7 30 2019-02-04 06:00:00 19.0 19.3 18.8 31 2019-02-04 07:00:00 19.7 20.4 19.3 32 2019-02-04 08:00:00 21.4 22.8 20.3 33 2019-02-04 09:00:00 23.5 23.9 22.8 34 2019-02-04 10:00:00 25.7 23.6 35 2019-02-04 11:00:00 26.5 25.4 36 2019-02-04 12:00:00 27.1 26.1 37 2019-02-04 13:00:00 25.8 26.8 24.8 38 2019-02-04 14:00:00 25.4 27.8 23.7 39 2019-02-04 15:00:00 22.1 24.1 20.2 40 2019-02-04 16:00:00 21.8 22.6 20.2 41 2019-02-04 17:00:00 20.9 22.4 19.6 42 2019-02-04 18:00:00 18.9 19.6 18.6 43 2019-02-04 19:00:00 18.8 18.9 18.6 44 2019-02-04 20:00:00 18.9 19.0 18.8 45 2019-02-04 21:00:00 18.8 18.9 18.7 46 2019-02-04 22:00:00 18.8 18.9 18.7 47 2019-02-04 23:00:00 18.9 19.2 18.7
示例3
并非一天中的所有时间都可用
不在输出DataFrame 中创建行
Date_time Mean_temp Max_temp Min_temp 48 2019-02-05 00:00:00 19.2 19.3 19.0 49 2019-02-05 01:00:00 19.3 19.4 19.3 50 2019-02-05 02:00:00 19.3 19.4 19.2 51 2019-02-05 03:00:00 19.4 19.5 19.4 52 2019-02-05 04:00:00 19.5 19.6 19.3 53 2019-02-05 05:00:00 19.3 19.5 19.1 54 2019-02-05 06:00:00 20.1 20.6 19.2 55 2019-02-05 07:00:00 21.1 21.7 20.6 56 2019-02-05 08:00:00 22.3 23.2 21.7 57 2019-02-05 15:00:00 25.3 25.8 25.0 58 2019-02-05 16:00:00 25.8 26.0 25.2 59 2019-02-05 17:00:00 24.3 25.2 23.3 60 2019-02-05 18:00:00 22.5 23.3 22.1 61 2019-02-05 19:00:00 21.6 22.1 21.1 62 2019-02-05 20:00:00 21.1 21.3 20.9 63 2019-02-05 21:00:00 21.2 21.3 20.9 64 2019-02-05 22:00:00 20.9 21.0 20.6 65 2019-02-05 23:00:00 19.9 20.6 19.7
示例4
一天中的所有时间都可用
最大值和/或最小值至少有一个NaN值
不在输出DataFrame 中创建行
Date_time Mean_temp Max_temp Min_temp 66 2019-02-06 00:00:00 19.7 19.8 19.7 67 2019-02-06 01:00:00 19.6 19.7 19.3 68 2019-02-06 02:00:00 19.0 19.3 18.6 69 2019-02-06 03:00:00 18.5 18.6 18.4 70 2019-02-06 04:00:00 18.6 18.7 18.4 71 2019-02-06 05:00:00 18.5 18.6 72 2019-02-06 06:00:00 19.0 19.6 18.5 73 2019-02-06 07:00:00 20.3 21.2 19.6 74 2019-02-06 08:00:00 21.5 21.7 21.2 75 2019-02-06 09:00:00 21.4 22.3 20.9 76 2019-02-06 10:00:00 23.5 24.4 22.3 77 2019-02-06 11:00:00 24.7 25.4 24.3 78 2019-02-06 12:00:00 24.9 25.5 23.9 79 2019-02-06 13:00:00 23.4 24.0 22.9 80 2019-02-06 14:00:00 23.3 23.8 22.9 81 2019-02-06 15:00:00 24.4 23.7 82 2019-02-06 16:00:00 24.9 25.1 24.7 83 2019-02-06 17:00:00 24.4 24.9 23.8 84 2019-02-06 18:00:00 22.5 23.8 21.7 85 2019-02-06 19:00:00 20.8 21.8 19.6 86 2019-02-06 20:00:00 19.1 19.6 18.9 87 2019-02-06 21:00:00 19.0 19.1 18.9 88 2019-02-06 22:00:00 19.1 19.1 19.0 89 2019-02-06 23:00:00 19.1 19.1 19.0
概括一下,上述输入将创建以下输出:
Date_time 00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00 09:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 21:00 22:00 23:00 Max Min
0 2019-02-03 18.6 18.6 18.2 18.0 18.0 18.3 18.7 20.1 21.7 23.3 23.7 24.6 25.1 24.5 23.9 19.6 19.2 19.8 19.6 19.3 19.2 19.3 18.8 19.0 25.7 17.9
1 2019-02-04 18.9 18.8 18.6 18.4 18.7 18.8 19.0 19.7 21.4 23.5 25.8 25.4 22.1 21.8 21.0 18.9 18.8 18.9 18.8 18.8 18.9 27.8 18.1
我对此进行了很好的思考,我只能想出一组可怕的if语句,我知道这些语句会非常慢,需要很长时间才能写出来(很抱歉,这是因为我不擅长编码(!
有人能找到可以有效处理这个问题的Pandas函数吗?
您可以在Date_time
列的当天使用groupby,并从每个组构建final_df
的每一行(每当max_temp
或min_temp
列中有任何缺失值,或者每当组的长度小于24时,移动到groupby的下一次迭代(
请注意,我假设您的Date_time
列的类型为datetime64[ns]
。如果不是,您应该运行以下行:df['Date_time'] = pd.to_datetime(df['Date_time'])
all_hours = list(pd.date_range(start='1/1/22 00:00:00', end='1/1/22 23:00:00', freq='h').strftime('%H:%M'))
final_df = pd.DataFrame(columns=['Date_time'] + all_hours + ['Max','Min'])
## construct final_df by using a groupby on the day of the 'Date_time' column
for group,df_group in df.groupby(df['Date_time'].dt.date):
## check if NaN is in either 'Max Temp' or 'Min Temp' columns
new_df_data = {}
if (df_group[['Max_temp','Min_temp']].isnull().sum().sum() == 0) & (len(df_group) == 24):
## create a dictionary for the new row of the final_df
new_df_data['Date_time'] = group
new_df_data.update(dict(zip(all_hours, [[val] for val in df_group['Mean_temp']])))
new_df_data['Max'], new_df_data['Min'] = df_group['Max_temp'].max(), df_group['Min_temp'].min()
final_df = pd.concat([final_df, pd.DataFrame(new_df_data)])
else:
continue
输出:
>>> final_df
Date_time 00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00 09:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 21:00 22:00 23:00 Max Min
0 2019-02-03 18.6 18.6 18.2 18.0 18.0 18.3 18.7 20.1 21.7 23.2 23.7 24.6 25.1 24.5 23.9 19.6 19.2 19.8 19.6 19.3 19.2 19.3 18.8 19.0 25.7 17.9
0 2019-02-04 18.9 18.8 18.6 18.4 18.7 18.8 19.0 19.7 21.4 23.5 NaN NaN NaN 25.8 25.4 22.1 21.8 20.9 18.9 18.8 18.9 18.8 18.8 18.9 27.8 18.1