Plotting data for different days on one axis HH: MM: SS

DataFrame

has temporal data and I want to visually compare the diurnal temporal evolution of the data. If I am a groupby

day and plot schedules; they are obviously shifted horizontally in time due to differences in their dates.

I want to plot the date agnostic graph of the daily trends along the time axis only. For this purpose, I have attached the shift

data back to the appropriate number of days as shown in the following code

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()

      

which leads to the following graph

daily trend time wise

Question: Is this the pandas way of doing it? In other words, how can I achieve this more elegantly?

+3


source to share


2 answers


You can select the hour

index attribute after grouping like this:

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

      



enter image description here

+1


source


It might be too late for this answer, but in case someone is still looking for it.

This solution works for different months (it was a problem if using the code from the original question) and keeps fractional hours.



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()

      

0


source







All Articles