查找 24 小时范围内的最大值,并提取该行的所有属性

时间:2021-01-20 19:27:26

标签: python pandas

我真的需要一些帮助,但不知道该怎么做。我对编码相当陌生。

我有一年 (2018) 年(2018 年)的每小时臭氧、CO、风和温度数据,这些数据来自加利福尼亚州帝国县的 Calexico,我正在努力有效地计算每天臭氧的最大每日 8 小时平均值 (MDA8)。我已经复制了我的数据框:

import pandas as pd
df = pd.DataFrame({'date': ['1-1-2018 00:00:00', '1-1-2018 01:00:00', '1-1-2018 02:00:00', '1-1-2018 03:00:00', '1-1-2018 04:00:00', '1-1-2018 05:00:00', '1-1-2018 06:00:00', '1-1-2018 07:00:00',
                                '1-1-2018 08:00:00', '1-1-2018 09:00:00', '1-1-2018 10:00:00', '1-1-2018 11:00:00', '1-1-2018 12:00:00', '1-1-2018 13:00:00', '1-1-2018 14:00:00', '1-1-2018 15:00:00',
                                '1-1-2018 16:00:00', '1-1-2018 17:00:00', '1-1-2018 18:00:00', '1-1-2018 19:00:00', '1-1-2018 20:00:00', '1-1-2018 21:00:00', '1-1-2018 22:00:00', '1-1-2018 23:00:00',
                                '1-2-2018 00:00:00', '1-2-2018 01:00:00', '1-2-2018 02:00:00', '1-2-2018 03:00:00', '1-2-2018 04:00:00', '1-2-2018 05:00:00', '1-2-2018 06:00:00', '1-2-2018 07:00:00',
                                '1-2-2018 08:00:00', '1-2-2018 09:00:00', '1-2-2018 10:00:00', '1-2-2018 11:00:00', '1-2-2018 12:00:00', '1-2-2018 13:00:00', '1-2-2018 14:00:00', '1-2-2018 15:00:00',
                                '1-2-2018 16:00:00', '1-2-2018 17:00:00', '1-2-2018 18:00:00', '1-2-2018 19:00:00', '1-2-2018 20:00:00', '1-2-2018 21:00:00', '1-2-2018 22:00:00', '1-2-2018 23:00:00'],
                   'ozone': [30.0, 32.1, 33.5, 33.7, 35.6, 34.8, 35.2, 36.1, 36.1, 36.3, 36.5, 37.2, 38.4, 39.9, 40.0, 42.1, 43.4, 42.5, 41.0, 40.0, 38.6, 36.6, 36.1, 36.6,
                             35.4, 33.0, 31.5, 32.6, 33.0, 33.8, 34.2, 35.1, 35.6, 36.2, 36.9, 37.5, 37.9, 38.3, 39.5, 40.5, 41.4, 42.8, 44.6, 44.0, 43.8, 42.1, 40.2, 39.9],
                   'temperature': [12.2, 12.2, 12.4, 12.1, 12.3, 12.5, 12.6, 12.8, 12.9, 13.1, 13.2, 13.4, 13.6, 13.7, 13.9, 13.9, 13.5, 13.2, 13.1, 13.1, 12.8, 12.8, 12.7, 12.7,
                                   12.6, 12.4, 12.4, 12.3, 12.1, 12.5, 12.7, 12.7, 12.9, 13.0, 13.0, 13.3, 13.5, 13.6, 13.8, 13.9, 14.0, 13.9, 13.7, 13.6, 13.4, 13.1, 12.9, 12.8],
                   'wind speed': [3.1, 3.2, 3.3, 3.3, 2.3, 3.4, 3.4, 2.1, 3.6, 3.6, 3.5, 3.2, 3.1, 2.8, 2.7, 2.9, 2.4, 2.6, 2.4, 2.1, 2.5, 2.7, 2.3, 2.2, 
                                  2.5, 2.8, 2.5, 2.6, 2.4, 2.3, 5.1, 5.5, 5.2, 4.6, 4.1, 3.1, 3.2, 3.1, 3.2, 3.4, 3.1, 3.5, 3.7, 3.4, 3.2, 3.1, 3.5, 3.4],
                   'CO': [0.33, 0.31, 0.31, 0.34, 0.35, 0.31, 0.31, 0.33, 0.30, 0.29, 0.28, 0.28, 0.27, 0.24, 0.21, 0.22, 0.23, 0.25, 0.21, 0.28, 0.31, 0.23, 0.31, 0.29,
                          0.33, 0.31, 0.31, 0.34, 0.35, 0.31, 0.31, 0.33, 0.30, 0.29, 0.28, 0.28, 0.27, 0.24, 0.21, 0.22, 0.23, 0.25, 0.21, 0.28, 0.31, 0.23, 0.31, 0.29]}, 
                  index=['date'])

我创建了一个代码来计算臭氧的 8 小时滚动平均值并找到每日最大值:

df['O3_mda8_3135'] = df.ozone.rolling('8H', min_periods=2).mean().shift(-4)
O3_mda8_3135 = df.groupby([date.month,date.day])['O3_mda8_3135'].max()

但是,在我的新数据框中,我还需要一天中臭氧最大值发生时间的温度、CO 和风值。我不确定如何做到这一点。对于更小的数据框,我尝试过: np.isclose(df['O3_mda8_3135'], #####).argmax() 但我无法在一年中的每一天单独执行此操作,尤其是在存在重复值的可能性很小的情况下。是否有某种循环代码可以让我尝试将最大臭氧浓度行拉入一个新的数据框中,并拥有 365 行每天 8 小时平均、CO、风和温度的最大臭氧?

我希望新的数据框是:

df2 = pd.DataFrame({'date': ['1-1-2018 17:00:00', '1-2-2018 19:00:00'],
                    'ozone': [43.4, 44.6],
                    'temperature': [13.5, 13.7],
                    'wind speed': [2.4, 3.7],
                    'CO': [0.23, 0.21]})

基于从臭氧列中提取的最大值,但显示该最大值处对应日期时间的值。

UPDATE:我发现了这个功能 df.groupby([date.month, date.day])[O3_mda8_3135].idxmax(axis='columns') 这给了我最大臭氧值的日期时间戳,但是,它只向我显示时间戳,我想从相应的行中提取所有属性。

2 个答案:

答案 0 :(得分:2)

GroupBy 对象有一个 idxmax()(和 idxmin())方法,可用于返回每个组内最大值的索引。您可以使用它来索引您的原始数据:

>>> df.loc[df.groupby([df['date'].dt.date])['O3_mda8_3135'].idxmax()]

                  date  ozone  temperature  wind speed    CO  O3_mda8_3135
16 2018-01-01 16:00:00   43.4         13.5         2.4  0.23       40.9375
42 2018-01-02 18:00:00   44.6         13.7         3.7  0.21       42.4250

日期与您描述的输出不匹配,但我认为这些是正确的?

此外,我在这里使用 groupby 属性而不是 dt.datedt.month 按日期执行 dt.day

答案 1 :(得分:1)

由于您发布问题的方式,我无法复制您的数据,也无法清除您想要的输出,但我认为以下代码将使您更接近您想要的:

以下代码可能会为您提供每日 max() 值,并且还会获取您在新数据框中列出的列

O3_mda8_3135 = (df.groupby([date.month,date.day]).agg({'O3_mda8_3135':'max','TEMP_col':'first','CO_col':'first','WIND_col':'first'}).reset_index())

请注意,我在那里写的“TEMP_col”、“CO_col”、“WIND_col”应分别替换为您的温度/CO/风列的实际列名。 >