отображение данных за разные дни на одной оси ЧЧ:ММ:СС

DataFrame имеет данные с временными метками, и я хочу визуально сравнить ежедневную временную эволюцию данных. Если я groupby день и построить графики; они явно смещены по горизонтали во времени из-за различий в их датах.

Я хочу построить независимый от даты график дневных тенденций на оси времени. С этой целью я прибегнул к shiftвозврату данных на соответствующее количество дней, как показано в следующем коде.

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

index1 = pd.date_range('20141201', freq='H', periods=2)
index2 = pd.date_range('20141210', freq='2H', periods=4)
index3 = pd.date_range('20141220', freq='3H', periods=5)

index = index1.append([index2, index3])

df = pd.DataFrame(list(range(1, len(index)+1)), index=index, columns=['a'])

gbyday = df.groupby(df.index.day)

first_day = gbyday.keys.min() # convert all data to this day

plt.figure()
ax = plt.gca()
for n,g in gbyday:
    g.shift(-(n-first_day+1), 'D').plot(ax=ax, style='o-', label=str(n))

plt.show()

в результате получается следующий сюжет

ежедневный тренд во времени

Вопрос: Это способ панд сделать это? Другими словами, как я могу добиться этого более элегантно?


person awhan    schedule 22.12.2014    source источник


Ответы (2)


Вы можете выбрать атрибут hour индекса после группировки следующим образом:

In [36]: fig, ax = plt.subplots()
In [35]: for label, s in gbyday:
   ....:     ax.plot(s.index.hour, s, 'o-', label=label)

введите здесь описание изображения

person TomAugspurger    schedule 22.12.2014
comment
Это решение отбрасывает информацию о «минутах» и «секундах», так что график содержит только почасовые тренды. Конечно, я понимаю, что можно создать мультииндекс, используя s.index.hour, s.index.minute и т. д., но это столько же работы, если не больше, как код в моем вопросе. - person awhan; 22.12.2014

Возможно, для этого ответа уже слишком поздно, но на случай, если кто-то все еще ищет его.

Это решение работает в разные месяцы (это было проблемой при использовании кода из исходного вопроса) и сохраняет дробные часы.

import pandas as pd
import matplotlib.pyplot as plt

index0 = pd.date_range('20141101', freq='H', periods=2)
index1 = pd.date_range('20141201', freq='H', periods=2)
index2 = pd.date_range('20141210', freq='2H', periods=4)
index3 = pd.date_range('20141220', freq='3H', periods=5)

index = index1.append([index2, index3, index0])
df = pd.DataFrame(list(range(1, len(index)+1)), index=index, columns=['a'])


df['time_hours'] = (df.index - df.index.normalize()) / pd.Timedelta(hours=1)

fig, ax = plt.subplots()
for n,g in df.groupby(df.index.normalize()):
    ax.plot(g['time_hours'], g['a'], label=n, marker='o')

ax.legend(loc='best')
plt.show()
person Victor Uriarte    schedule 11.04.2019