【问题标题】:Is there a ready solution in matplotlib to plot times?matplotlib 中是否有现成的解决方案来绘制时间?
【发布时间】:2013-09-22 14:14:52
【问题描述】:

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

我使用tespeed 生成的数据编写了一个脚本。数据的格式为“YYYYMMDDhhmm,down rate, up rate,unit,server”(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()

最后,这会产生这样的情节:

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

有没有什么优雅的方法可以做到这一点?也许是一个准备好的模块? ;-)

【问题讨论】:

  • 在绘图前将日期解析为 datetime 对象。 x += [datetime.strptime(row[0], '%Y%m%d%H%M%S')]
  • @ViktorKerkez:好的,插入import datetime 并替换了您的建议。收到错误AttributeError: 'module' object has no attribute 'strptime'。应该找到 datetime,因为 >>> print(dt.date.today()) 2013-09-22 的行为符合预期。
  • 使用from datetime import datetime。该模块有一些不幸的命名选择。

标签: python time matplotlib plot


【解决方案1】:

Matplotlib 接受datetimes,因此您可以使用解析时间

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

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    相关资源
    最近更新 更多