Выполните итерацию по объекту DataFrameGroupBy pandas для создания годовых изображений с ежемесячными субплотами - PullRequest
1 голос
/ 24 мая 2019

У меня есть пандас DataFrame с указателем даты и времени почасовой скорости и направления ветра.Мой цикл охватывает 31 год, и мне нужно делать ежегодные снимки месячных розовых ветров.Это переводит в 31 изображение, каждое с 12-ю участками.

Я понял, как получить розу ветров с помощью пакета Виндроз.Используя 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, но ожидал скалярное bool

Так что на этом этапе я хочу иметь возможностьсначала выполнить итерацию по годам, а затем по месяцам (в год), чтобы в конечном итоге создавать годовые изображения с ежемесячными подзаговорами.

1 Ответ

0 голосов
/ 24 мая 2019

Ваша ошибка здесь:

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)

(в вашем коде вы использовали «date»вместо «x» в лямбда-выражении, поэтому оно тоже не удалось).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...