比较单点绘图上的多年数据

2024-09-30 22:13:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同年份的时间序列存储在数据框中。例如:

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月,比较不同年份之间的差异。我可以通过为其中一个数据集创建一个“假”索引来实现这一点,以便它们有一个共同的年份:

data16.index = data15.index[:len(data16)]
ax = data15.plot()
data16.plot(ax=ax)

但如果可能的话,我想避免弄乱索引。这种方法的另一个问题是,年份(2015年)将出现在我不想要的x轴刻度标签中。有人知道更好的方法吗


Tags: columns数据dataframedateindexplotrangeax
3条回答

您可以使用pandas.DatetimeIndex.dayofyear来获取日数,这将允许您将两个不同年份的数据相互叠加

in: date=pd.datetime('2008-10-31')
in: date.dayofyear
out: 305

我看到两种选择

选项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')

不用说,我会推荐第一种选择

一种方法是在第一个数据帧上覆盖一个透明的轴,并在该数据帧中绘制第二个数据帧,但是您需要同时更新两个轴的x限制(类似于twinx)。然而,我认为这需要做更多的工作,并且还有一些缺点:例如,你不能再轻松地以交互方式缩放到一个特定区域,除非你确保两个轴都通过它们的x限制链接。实际上,最简单的方法是通过“弄乱索引”来考虑这种抵消

对于勾号标签,您可以通过指定x勾号格式轻松更改格式,使其不显示年份:

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)

请看一下matplotlib API example for specifying the date format

相关问题 更多 >