-5

我正在尝试使用 matplotlib 和 pandas 绘制一些数据。但是,当使用 DateFormatter 时,日期的渲染不正确取决于我从 DataFrame 中过滤出的内容:

下面两个示例中的日期使用 matplotlib 呈现为“2013 年 8 月 20 日 00 日”,正如预期的那样:

df['metric2'].plot()
ax = gca()
ax.xaxis.set_major_formatter(DateFormatter('%B %d %H %Y'))
draw()

df[df['metric1']>1000]['metric2'].plot()
ax = gca()
ax.xaxis.set_major_formatter(DateFormatter('%B %d %H %Y'))
draw()

但是使用下面的代码,日期被呈现为“February 01 00 1048”:

df[df['browser']=='Chrome/29']['metric2'].plot()
ax = gca()
ax.xaxis.set_major_formatter(DateFormatter('%B %d %H %Y'))
draw()
4

1 回答 1

4

我们需要有一组具体的数据和一个可供参考的程序。这里没有问题:

数据.txt:

2013-08-18 00   IE  1000    500 3000
2013-08-19 00   FF  2000    250 6000
2013-08-20 00   Opera   3000    450 9000
2001-03-21 00   Chrome/29   3000    450 9000
2013-08-21 00   Chrome/29   3000    450 9000
2014-01-22 00   Chrome/29   3000    750 9000

.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as md
import datetime as dt


df = pd.read_table(
    'data.txt', 
    index_col=0, 
    parse_dates=True,
    date_parser=lambda s: dt.datetime.strptime(s, '%Y-%m-%d %H'),
    header=None,
    names=['browser', 'metric1', 'metric2', 'metric3']
)

print df

df[df['browser']=='Chrome/29']['metric2'].plot()
ax = plt.gca()
ax.xaxis.set_major_formatter(md.DateFormatter('%B %d %H %Y'))
plt.draw()
plt.show()


--output:--
              browser  metric1  metric2  metric3
2013-08-18         IE     1000      500     3000
2013-08-19         FF     2000      250     6000
2013-08-20      Opera     3000      450     9000
2001-03-21  Chrome/29     3000      450     9000
2013-08-21  Chrome/29     3000      450     9000
2014-01-22  Chrome/29     3000      750     9000

在此处输入图像描述

并且调整轴以便您可以更好地查看点(设置x轴的日期范围,设置y轴的范围):

...
df[df['browser']=='Chrome/29']['metric2'].plot(style='r--')
ax = plt.gca()
ax.xaxis.set_major_formatter(md.DateFormatter('%B %d %H %Y'))

ax.set_xlim(dt.datetime(2000, 1, 1,), dt.datetime(2017, 1, 1))
ax.set_ylim(400, 1000)
...
...

在此处输入图像描述

只要您拒绝发布一个最小示例以及产生您不想要的输出的数据......

于 2013-09-18T03:28:31.477 回答