Разделение сюжетов matplotlib по диапазонам дат - PullRequest
0 голосов
/ 10 июня 2019

Я ищу более питонический способ разбить очень большой график на несколько участков, разделенных по месяцам (февраль, март и т. Д.)

Я преобразовал все значения даты в dfв DateTime с использованием

pd.to_datetime(df['dates']

Затем мне удалось создать новые переменные, содержащие фрагменты моего информационного кадра, на основе желаемых диапазонов дат, но это не похоже на самый эффективный / воспроизводимый метод.Мой первоначальный мыслительный процесс состоял в том, чтобы установить ограничение по оси X с помощью datetime () и передать два аргумента для нужных мне диапазонов дат.Все еще не очень эффективный, но мой начальный набор данных имеет только пять месяцев.

plt.figure(1)
plt.subplot(511)
plt.plot(x['dates'], y, marker='o')
plt.xticks(rotation='vertical')
plt.rcParams['figure.figsize'] = (30,10)
plt.xlabel('time')
plt.ylabel('day-over-day change')
plt.xlim([datetime.date.strftime(2019, 2, 1), 
datetime.date.strftime(2019, 2, 28)])
plt.show()

Я ожидаю небольшой подзаговор, содержащий все точки данных, которые попадают в период с 1/2/2019 по 2/2/2019, но когдаЯ запускаю этот код, я получаю сообщение об ошибке типа:

TypeError: descriptor 'strftime' requires a 'datetime.date' object but 
received a 'int'

РЕДАКТИРОВАТЬ: Я также пытался

plt.xlim([datetime.date(2019, 2, 1), datetime.date(2019, 2, 26)])

, но это приводит к ошибке:

TypeError: datetime.date(2019, 2, 1) is not a string

Именно поэтому я пытаюсь использовать 'strftime'

END EDIT

, при этом автоматическое создание правильного количества вспомогательных участков будет идеальным, сейчас я просто заинтересован в передачеправильные аргументы через matplotlib.pyplot (), чтобы я мог сделать данные более удобочитаемыми для моего клиента.Если кто-то хочет заняться процессом итерации через df с целью автоматизации определения количества графиков (и их правильной сегментации), я бы не стал возражать.

1 Ответ

1 голос
/ 10 июня 2019

Ваше текущее использование strftime использует неверный ввод. strftime() берет объект даты и преобразует его в строку. Вместо этого попробуйте datetime.date(Y, M, D).

Кроме того, вы можете использовать некоторые встроенные функции панд для индексации и разделения временных массивов на отдельные временные области. В частности, функциональность Grouper () позволяет группировать столбцы даты и времени по общим атрибутам времени, таким как месяц, неделя, год. Вот пример кода, который генерирует кадр данных, а затем разбивает его на отдельные кадры для каждого месяца:

import datetime
import pandas as pd

dates = []
values = []

for i in range(1,12):
    for j in range(1, 10):
        dates.append(datetime.date(2019, i, j))
        values.append(i*j)

pd_time = pd.to_datetime(dates)

data = {"timestamp": pd_time, "values": values}
df = pd.DataFrame(data)
months = [g for n, g in df.set_index('timestamp').groupby(pd.Grouper(freq='M'))]

смотрит на результат months показывает:

>>> months
[            values
timestamp
2019-01-01       1
2019-01-02       2
2019-01-03       3
2019-01-04       4
2019-01-05       5
2019-01-06       6
2019-01-07       7
2019-01-08       8
2019-01-09       9,             values
timestamp
2019-02-01       2
2019-02-02       4
2019-02-03       6
2019-02-04       8
2019-02-05      10
2019-02-06      12
2019-02-07      14
2019-02-08      16
2019-02-09      18,             values
...

См. SO thread для получения информации о разбиении временных рядов по диапазону дат.

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