【问题标题】:Pandas - comparing average of hour periods against each other for a given date rangePandas - 比较给定日期范围内的平均小时数
【发布时间】:2020-06-18 13:55:58
【问题描述】:

我正在尝试习惯在 Pandas 中使用日期时间数据并为给定数据集绘制不同的比较。我正在使用London Air Quality Ozone 数据集进行练习,并尝试使用 Pandas 和 matplotlib 复制下面的图表(我使用 Excel 中的数据透视表创建的)。

该图表绘制了整个数据集中每个位置每小时臭氧读数的平均值,以查看是否有一个位置始终高于其他位置,或者不同位置在一天中的不同时期是否具有最高的臭氧水平。

基本上,我希望绘制每个位置的臭氧小时平均值。

我尝试将数据重塑为多索引格式,然后进行绘图,类似于我在绘图之前在 excel 中所做的,但我不确定这是否是解决问题的正确方法。重塑代码如下。我仍然习惯于重塑,所以不确定这是否是正确的使用/我正在以正确的方式解决问题并接受其他方法来完成这项任务。任何帮助完成这项任务将不胜感激!

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime

data = pd.read_csv('/Users/xx/Downloads/LaqnData.csv')

data['ReadingDateTime'] = pd.to_datetime(data['ReadingDateTime'])

data['Date'] = pd.to_datetime(data['ReadingDateTime']).dt.date
data['Time'] = pd.to_datetime(data['ReadingDateTime']).dt.time

data.set_index(['Date', 'Time'], inplace = True)

hourly_dataframe = data.pivot_table(columns = 'Site', values = 'Value', index = ['Date', 'Time'])

hourly_dataframe.fillna(method = 'ffill', inplace = True)
hourly_dataframe[hourly_dataframe < 0] = 0

【问题讨论】:

    标签: python-3.x pandas datetime matplotlib


    【解决方案1】:

    我已访问该网站并下载了以下内容的 24 小时阅读;

    data.Site.unique()
    

    数组(['BX1', 'TH4', 'BT4', 'HI0', 'BL0', 'RD0'], dtype=object)

    到目前为止,我采用了您的代码:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import datetime
    
    data = pd.read_csv('/Users/xx/Downloads/LaqnData.csv')
    
    data['ReadingDateTime'] = pd.to_datetime(data['ReadingDateTime'])
    

    然后我在 groupby 函数中使用datetime index 调用每个小时。

    data.groupby([data.index.hour, data['Site']])['Value'].mean().reset_index()`#Convert to dataframe.`
    

    要绘图,我将unstack 链接到 groupby 函数并直接绘图。

    data.groupby([data.index.hour, data['Site']])['Value'].mean().reset_index#unstack().plot()
    plt.xlabel('Hour of the day')
    plt.ylabel('Ozone')
    plt.title('Avarage Hourly comparison')
    plt.legend()`# If you want the legend to appear in default location`
    

    如果对传说的位置大惊小怪,这个post 解释得很好。在你的情况下;

    plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.15),
              fancybox=True, shadow=True, ncol=6)
    

    【讨论】:

    • 当我按照您编写的代码运行代码时,我收到错误“AttributeError: 'RangeIndex' object has no attribute 'hour'' - 我认为这是引用当前设置的索引的事实没有'小时'元素,所以我尝试使用'data.set_index('ReadingDateTime',inplace = True)'将索引设置为日期时间格式,这给了我我想要的表格格式的输出,但后来我很困惑关于拆垛。你能详细说明一下吗? - 我收到错误消息“找不到带有标签的句柄放在图例中。”如果按照你上面写的那样运行
    • 我已经返回并在另一台机器上重新运行代码并且它可以工作。请在设置索引之前将您的 ReadingDateTime 设置为日期时间,如下所示; data['ReadingDateTime'] = pd.to_datetime(data['ReadingDateTime'])#Converting to datetime 继续检查它是否已设置为 datetime64[NS] BY CALLING: data.dtypes#Checking datatpes for all columns
    • 将瓷砖堆叠起来。 Unstacking flatten 数据框。考虑绘制一个堆叠的数据框,带有多层列的数据透视表(2d); data.groupby([data.index.hour, data['Site']])['Value'].mean() 与使用单层列 data.groupby([data.index.hour, data['Site']])['Value'].mean().unstack()
    • 一旦我设置了索引并正确使用了 unstack() 函数,它就可以工作并且我已经接受了答案,谢谢!你能解释一下为什么我们在这一行中使用 groupby() 函数时需要 reset_index() - data.groupby([data.index.hour, data['Site']])['Value'].mean()。重置索引()
    • 一个 groupby 函数给了我们一个系列。当 reset_index() 链接到 groupby 时,它将系列转换为数据帧。另一种方法是将 pandas.Series.to_frame¶ 链接到 groupby 函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2015-07-26
    • 1970-01-01
    • 2010-09-13
    • 2018-02-22
    • 1970-01-01
    相关资源
    最近更新 更多