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

Python 查找24小时范围内的最大值,并提取该行的所有属性,python,pandas,Python,Pandas,我真的需要一些帮助,但不知道该怎么做。我对编码相当陌生 我有一年(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-2

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

我有一年(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')

这给了我最大臭氧值的日期时间戳,但是,它只显示时间戳,我想从相应的行中提取所有属性。

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

下面的代码可能会为您提供每日
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/风列的实际列名。

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

下面的代码可能会为您提供每日
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/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.month
dt.day
groupby
idxmax()
(和
idxmin()
)方法,用于groupby对象返回每个组中最大值的索引。您可以使用此功能为原始数据编制索引:

>>> 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.month
dt.day

按日期执行
groupby
,用于此操作的数据帧的结构是什么?这将是方便知道,以便我们可以给你的建议。嗨,我刚刚更新了我的文章,包括我的数据框架的格式什么是数据框架的结构,你正在使用这个操作?这将是方便知道,以便我们可以给你的建议。嗨,我刚刚更新了我的帖子,包括我的数据框架的格式感谢反馈,我更新了我的问题,以更具体。我尝试了您的建议,但不断收到一条错误消息,上面写着
ValueError:cannotinsert date,已经存在
,但我没有在.agg()部分包含date列。此外,我的datetime位于date列中,该列不是索引。这就是我出错的原因吗?我尝试在.agg()中包含date列,并重命名了该列,但得到
规范错误:不支持嵌套重命名器
。我试过了,但没用。而且,“first”给了我当天这些列的第一个值。我需要最大值出现时这些列的值。因此,在这个示例数据帧中,1/1上的最大值出现在下午5点,因此我需要其他值在下午5点。感谢反馈,我更新了我的问题,使其更加具体。我尝试了您的建议,但不断收到一条错误消息,上面写着
ValueError:cannotinsert date,已经存在
,但我没有在.agg()部分包含date列。此外,我的datetime位于date列中,该列不是索引。这就是我出错的原因吗?我尝试在.agg()中包含date列,并重命名了该列,但得到
规范错误:不支持嵌套重命名器
。我试过了,但没用。而且,“first”给了我当天这些列的第一个值。我需要最大值出现时这些列的值。在这个示例数据帧中,1/1的最大值出现在下午5点,所以我需要其他值在下午5点谢谢,我在看到这个之前找到了这些函数。我唯一需要做的编辑就是将索引重置为数字索引。我使用的最后一个代码是
O3_mda8_3135=df.loc[df.reset_index().groupby([date.month,date.day])['O3_mda8_3135'].idxmax()]
谢谢,我在看到这个之前就找到了这些函数。我唯一需要做的编辑就是将索引重置为数字索引。我最后使用的代码是