在matplotlib中是否有现成的解决方案来绘制时间?

时间:2013-09-22 14:14:52

标签: python time matplotlib plot

这个问题有两个部分。如果它缺乏对其他来源的搜索,请耐心等待。这是我问题的一部分。

我使用tespeed生成的数据编写了一个脚本。数据格式为“YYYYMMDDhhmm,下降率,上行率,单位,服务器”(hh:mm of ...)。

201309221537,0.28,0.04,"Mbit","['speedtest server']"
201309221542,5.78,-1.00,"Mbit","['speedtest server']"
201309221543,0.15,0.06,"Mbit","[...]"

此脚本绘制上述数据:

#!/usr/bin/env    
python2.7                                                                                    
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import csv

def main():
    x = []
    y = []
    with open('/path/to/my/public_html/stdout_tespeed_log.csv','r') as csvfile:
        strData = csv.reader(csvfile, delimiter=',')
        for row in strData:
            x += [float(row[0])]
            y += [float(row[1])]
    fig = plt.figure()
    plt.plot(x,y,'+', label='Average download')
    plt.gca().xaxis.major.formatter.set_scientific(False)
    plt.gca().xaxis.major.formatter.set_powerlimits((-2,13))
    locs,labels = plt.xticks()
    plt.xticks(locs, map(lambda x: "%12.0f" % x, locs))
    plt.axis([x[0], x[-1],0,6.5])
    plt.xticks(rotation=20)
    plt.xlabel('Date [YYYYMMDDhhmm]')
    fig.subplots_adjust(bottom=0.2)
    # plt.legend(loc=3)

    plt.gcf().autofmt_xdate()
    plt.savefig("/path/to/my/public_html/speed.png")

main()

最后这会产生如下情节: the plot

时间轴配置不正确。 : - /周期性出现的差距是因为每小时没有60-99分钟。

有没有一些优雅的方法来实现这一目标?也许是准备好的模块? ; - )

1 个答案:

答案 0 :(得分:3)

Matplotlib接受datetime,因此您可以使用

解析时间
import datetime
datetime.datetime.strptime(row[0], "%Y%m%d%H%M")

这应该可以正常工作。

格式化选项不会以这种方式运行(.set_scientific(False)),而且

plt.xticks(locs, map(lambda x: "%12.0f" % x, locs))

应替换为

之类的内容
import matplotlib.dates as mdates
...
plt.gca().xaxis.major.formatter = mdates.DateFormatter('%Y/%m/%d %H:%M')