如何从Pandas DataFrame中采样数据,其中数据在给定的一天中每小时都存在



我希望创建一个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_tempmin_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

相关内容