#python #matplotlib #monthcalendar
Вопрос:
благодарен за некоторую помощь здесь!
У меня есть 3 кадра данных в Python и Matplotlib, каждый со столбцами «дата» как datetime64, например «2020-03-05″. Когда я их строю, я не могу получить месяц/да по возрастанию слева направо»
vc = pd.concat([df1, df2, df3])
vc['month_year'] = vc['date'].dt.strftime('%b %Y')
vc['month_year'].value_counts().plot(kind='bar')
Спасибо!
Комментарии:
1. Что произойдет, если я отсортирую их в порядке возрастания после вычисления частоты?
2. Можете ли вы добавить свой вывод? Вы можете попробовать добавить флаг
ascending=True
вvalue_counts()
метод:vacancies['MONTH_YEAR'].value_counts(ascending=True).plot(kind='bar')
3. Если это не работает, попробуйте: Или попробуйте перейти на это:
vacancies['MONTH_YEAR'].value_counts(ascending=True).sort_values(by='MONTH_YEAR',ascending = True).plot(kind='bar')
4. @EitanRosati добавление: по возрастанию=True просто измените текущий порядок,но все равно не упорядочивайте по месяцам/годам слева направо .значения сортировки(по=’MONTH_YEAR’, по возрастанию = True) получает ошибку «Ошибка типа: значения сортировки() получил неожиданный аргумент ключевого слова «by», но спасибо!
Ответ №1:
Чтобы отобразить месяцы в порядке возрастания, вы можете сделать так:
strftime()
Возвращаемоеndarray
значение, поэтому оно имеет другой вид, чем объект datetime. вместо приведения его сstrftime()
помощью приведения к объекту периода:dt.to_period('M')
.- после
value_counts()
того, как значения будут отсортированы по количеству иmonth_year
станут индексом этого фрейма данных. поэтому вам нужно просто отсортировать индекс перед построением графика.
Ваш код после изменений:
vc = pd.concat([df1, df2, df3])
vc['month_year'] = vc['date'].dt.to_period('M')
vc_graph = vc['month_year'].value_counts().sort_index(ascending=True)
vc_graph.index = (vc_graph.index).strftime('%b %Y')
vc_graph.plot(kind='bar')
Результат будет выглядеть так:
Комментарии:
1. Спасибо, но я хотел бы сохранить форматирование как «ЯНВАРЬ 2019». Возможно ли это ?
2. Конечно, это добавит немного больше кода. Я добавил это в ответ