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

2024-05-19 08:59:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一年(2018年)的帝国郡加利福尼亚州卡莱西科的每小时臭氧、CO、风和温度数据,我试图有效地计算每天臭氧的最大每日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]})

基于从ozone列中提取的最大值,但在该最大值处显示相应日期时间的值

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


Tags: 数据dataframedfdate时间温度平均值pd
2条回答

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

下面的代码可能会为您提供dailymax()值,还将获得您在新数据框中概述的列

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/WIND列的实际列名

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

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

另外,我在这里使用dt.date属性而不是dt.monthdt.day按日期执行groupby

相关问题 更多 >

    热门问题