Matplotlib plot_date 在自定义时区下仍保持 UTC 时间

14 投票
4 回答
10302 浏览
提问于 2025-04-16 08:45

我在用matplotlib这个库在Python 2.6中绘制数据和时间戳的图表。我发现了plot_date()这个函数,效果很好!不过,所有的时间都是以UTC(协调世界时)显示的。我查了文档,上面说可以通过tz参数来设置自定义的时区。但是这个方法似乎不管用。即使我传了这个参数,时间还是显示在UTC。我也试了几种方法,但都没有成功。

注意:我导入了一个包含时间戳的CSV文件,用来生成X轴。所以,我是用epoch2num()函数把时间戳从epoch格式转换成matplotlib能用的格式。

示例代码:

import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import matplotlib.dates as mdates
from pytz import timezone

...

dates = mdates.epoch2num(dates) # Converting my list of dates from epochs
plt.plot_date(dates, data,fmt='-',tz="US/Eastern",xdate=True)

这段代码在轴上没有生成正确的时间戳。不过,图表的绘制是没问题的。

我还尝试了:

plt.plot_date(dates,data,fmt='-',tz=timezone('US/Eastern'),xdate=True)

结果和第一个例子一样,所有的时间还是在UTC。

为了好玩,我对“dates”列表使用了num2date()函数并打印了输出。结果显示的时间还是UTC。然后我在num2date()的调用中加上了tz=timezone('US/Eastern'),输出的值就变成了东部时间,正如我所期望的那样。

我还尝试在调用plot_date之前先把日期转换成东部时间,然后在plot_date中省略tz=这个参数,但结果还是UTC。

最后,我编辑了我的matplotlibrc文件,把#timezone UTC改成#timezone US/Eastern,结果还是没有成功。

我到底漏掉了什么,才能让这些日期在图表上显示为非UTC的时间呢?

4 个回答

4

如果你想要获取带有 EST 标签的日期,可以这样做:

import matplotlib.pyplot as plt
import pytz
import numpy as np
import datetime
import time

est=pytz.timezone('US/Eastern')
n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
# You could build timezone-aware datetime objects this way:
dates=[datetime.datetime.fromtimestamp(ts,est) for ts in timestamps]
# or use timezone-naive datetime objects using `utcfromtimestamp` below.
# plt.plot_date interprets naive datetime objects to be in the UTC timezone.
# dates=[datetime.datetime.utcfromtimestamp(ts) for ts in timestamps]    
values=np.cumsum(np.random.random(n) - 0.5)
plt.xticks(rotation=25)
plt.plot_date(dates,values,tz=est,linestyle='dashed')
plt.show()

这样做会得到以下结果:

alt text

5

我在使用Matplotlib 1.0.1的时候也遇到了这个问题。

我在调试器里查看了一下,个人觉得参数 tz 被忽略了。这个问题出在 matplotlib.axes.Axes.xaxis_date 这个地方(文件 "axes.py",第2679行)。

我已经为这个问题提交了一个bug报告:

https://sourceforge.net/tracker/index.php?func=detail&aid=3176823&group_id=80706&atid=560720

3

我卸载了Matplotlib 1.0.0,然后安装了0.99.3版本。这样做之后,我现在可以正确设置时区,并且能看到效果。我用Unutbu提供的示例测试了一下,然后又用我自己的代码测试。结果一切都正常。

也许1.0.0版本有个bug呢?

撰写回答