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()
产生以下情节
问题:这是熊猫的做法吗?换句话说,我怎样才能更优雅地实现这一目标?
答案 0 :(得分:1)
您可以在分组后选择索引的hour
属性:
In [36]: fig, ax = plt.subplots()
In [35]: for label, s in gbyday:
....: ax.plot(s.index.hour, s, 'o-', label=label)
答案 1 :(得分:0)
这个答案可能为时已晚,但是万一有人还在寻找它的话。
此解决方案可以在不同的月份使用(如果使用原始问题中的代码,这是一个问题),并且可以保留小时数。
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()