遍历pandas DataFrameGroupBy对象以创建具有每月子图的年度图像

时间:2019-05-24 16:18:08

标签: pandas pandas-groupby

我有一个熊猫DataFrame,其日期时间索引为每小时风速和风向。我的时间序列涵盖31年,我需要制作每月风玫瑰的年度图像。这将转换为31个图像,每个图像具有12个子图。

我已经弄清楚了如何使用Windrose软件包获得windrose。使用GroupBy,我可以按每年和/或每月对数据进行分组。

我曾尝试按年和月分组,但无法弄清楚如何逐年迭代以制作月度图

grouped = data.groupby(by=[data.index.year, data.index.month])

接下来,我尝试进行一个for循环,并将每个组的数据每年分组

# Make lists of years and months
years = pd.Series(data.index.year).drop_duplicates(keep='first')
months = np.arange(1,13)

for year in years:
   yearly = data.groupby([data.index.year == year])

但这仅将数据分组为2017年的观察值,而不是2017年的观察值。如果我随后尝试使用以下方法过滤到2017年:

for year in years:
    yearly = data.groupby([data.index.year == year]).filter(lambda x: data.index.year == 2017)

我收到错误TypeError:过滤器函数返回了ndarray,但预期为标量布尔值

因此,在这一点上,我希望能够首先迭代数年,然后迭代数月(每年),最终创建具有每月子图的年度图像。

1 个答案:

答案 0 :(得分:0)

您的错误在这里:

for year in years:
   yearly = data.groupby([data.index.year == year])

yearly = data.groupby([data.index.year]将以年为单位对数据进行分组。您需要像这样每年遍历不同的组:

for name, group in yearly:
              ....

文档可在此处找到:http://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html#iterating-through-groups

对于每月分组,您可以执行以下操作:

yearly = data.groupby([data.index.year, data.index.month]),它将按年份,然后按月分组。

然后按每月进行过滤,例如仅返回2017年:

yearly = data.groupby([data.index.year, data.index.month]).filter(lambda x: x.index.year = 2017)

(在您的代码中,您在lambda语句中使用了“日期”而不是“ x”,这也是为什么它也失败了。)