我有两个存储在pandas数据帧中的不同年份的时间序列。例如:
data15 = pd.DataFrame(
[1,2,3,4,5,6,7,8,9,10,11,12],
index=pd.date_range(start='2015-01',end='2016-01',freq='M'),
columns=['2015']
)
data16 = pd.DataFrame(
[5,4,3,2,1],
index=pd.date_range(start='2016-01',end='2016-06',freq='M'),
columns=['2016']
)
我实际上处理的是每日数据,但如果这个问题得到充分回答,我可以弄清楚其余部分。
我试图做的是将这些不同数据集的图表叠加到1月到12月的单个图表上,以比较这些年份之间的差异。我可以通过创建一个" false"其中一个数据集的索引,因此它们具有共同年份:
data16.index = data15.index[:len(data16)]
ax = data15.plot()
data16.plot(ax=ax)
但我想尽可能避免弄乱索引。这种方法的另一个问题是年(2015)将出现在我不想要的x轴刻度标签上。有谁知道更好的方法吗?
答案 0 :(得分:2)
执行此操作的一种方法是在第一个上覆盖透明轴,并在第一个数据框中绘制,但是您需要同时更新两个轴的x限制(类似于twinx
)。但是,我认为这项工作要多得多,还有一些缺点:例如,除非你确保两个轴都通过x限制进行链接,否则你不能轻易地以交互方式缩放到特定区域。实际上,最简单的方法就是考虑到这种偏移,通过"搞乱索引"。
对于刻度标签,您可以轻松更改格式,以便他们不会通过指定x-tick格式来显示年份:
import matplotlib.dates as mdates
month_day_fmt = mdates.DateFormatter('%b %d') # "Locale's abbreviated month name. + day of the month"
ax.xaxis.set_major_formatter(month_day_fmt)
答案 1 :(得分:2)
我看到两个选项。
选项1 :在数据框中添加month
列
data15['month'] = data15.index.to_series().dt.strftime('%b')
data16['month'] = data16.index.to_series().dt.strftime('%b')
ax = data16.plot(x='month', y='2016')
ax = data15.plot(x='month', y='2015', ax=ax)
选项2 :如果您不想这样做,可以直接使用matplotlib
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(data15['2015'].values)
ax.plot(data16['2016'].values)
plt.xticks(range(len(data15)), data15.index.to_series().dt.strftime('%b'), size='small')
不用说,我会推荐第一个选项。
答案 2 :(得分:0)
您可以使用pandas.DatetimeIndex.dayofyear获取日期编号,以便您可以将两个不同年份的数据相互叠加。
in: date=pd.datetime('2008-10-31')
in: date.dayofyear
out: 305