在matplotlib.pyplot

时间:2017-10-11 20:37:46

标签: python datetime matplotlib

如何正确设置pyplot以在给定时区内绘制日期? 我可以看到放置tzinfo对象的各个地方,但所有这些都不做任何事情或者没有按预期远程工作。我从csv加载一个记录列表,每个记录是[以UTC为单位的天真时间戳,要绘制的数字]

import pytz
from datetime import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
estZone=pytz.timezone('US/Eastern')

records=[['10/10/17 12:00','100'],['11/10/17 12:00','150'],['12/10/17 12:00','200']]

def parseDT(stampString):
    return datetime.strptime(stampString,'%d/%m/%y %H:%M')

def plotGraph():
    xvalues=[]
    yvalues=[]
    for r in records:
        rdatetime=(parseDT(r[0])) #parseDT just returns naive DT
        rdatetime=pytz.utc.localize(rdatetime)
        rdatetime=rdatetime.astimezone(tz=estZone)
        xvalues.append(rdatetime)
        yvalues.append(int(r[1]))

    fig,ax=plt.subplots(figsize=(8,3))
    plt.plot_date(xvalues,yvalues,ls='solid',lw=1.5,aa=True,marker='None',color='g')
    dayFmt=mdates.DateFormatter('%a-%b-%d')
    hrFmt=mdates.DateFormatter('%H:00')
    ax.xaxis.set_major_formatter(dayFmt)
    ax.xaxis.set_major_locator(mdates.DayLocator())
    ax.xaxis.set_minor_locator(mdates.HourLocator(byhour=[6,12,18]))
    ax.xaxis.set_minor_formatter(hrFmt)
    plt.grid(b=True, which='both',linestyle='dotted')
    plt.show()

plotGraph()

这会产生(减去一些格式)这个数字:

First output 这实际上仍然是UTC。如果我省略了astimezone(tz=estZone),即使我已经确认该部分确实正常运行,但结果与结果完全相同。

如果我继续将tz=estZone传递给plt.plot_date,则数字相同。没有变化。如何更改此设置以从我的UTC时间戳创建EST图?

2 个答案:

答案 0 :(得分:0)

之前我尝试将时区传递给日期格式的x轴标签,但是在放置定位器之后似乎应用了时区修改器,使所有标签在每个午夜或指定的小时后读取4小时。我已经意识到定位器还需要时区作为参数来抵消这种情况。那就做了。

答案 1 :(得分:0)

过去一个小时我也一直在经历这个:源数据有正确的时区,但 Matplotlib 忽略了它。修复方法是将时区传递给定位器格式化程序。

示例代码说明:

plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=1, tz=local_tz))
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d/%m/%y', tz=local_tz))