【问题标题】:Creating datetime objects in UTC without timezone that can be imported by Matplotlib在没有时区的 UTC 中创建可以由 Matplotlib 导入的日期时间对象
【发布时间】:2019-06-27 21:20:57
【问题描述】:

我有一个以这种方式创建的 datetime 对象列表:

from datetime import datetime
import pytz

_year = 2018
_month = 2
_day = 3
_hour = 14
_minute = 30
csv_timezone = pytz.timezone('Europe/Berlin')

csv_dt = datetime(_year, _month, _day, _hour, _minute)
print('csv_dt')
print(csv_dt)

稍后我想在 UTC 中使用 Matplotlib:

utc_dt = csv_timezone.localize(csv_dt).astimezone(pytz.utc)
print('utc_dt')
print(utc_dt)

结果如下:

csv_dt
2018-02-03 14:30:00
utc_dt
2018-02-03 13:30:00+00:00

如前所述,我想在 Matplotlib 中使用这些对象。根据文档,它需要以下日期时间对象:

日期格式 通常,在 Python 程序中,日期表示为 datetime 对象,因此我们必须先将其他数据值转换为 datetime 对象,有时使用 dateutil 配套模块,例如:

导入日期时间

date = datetime.datetime(2009, 03, 28, 11, 34, 59, 12345)

导入 dateutil.parser

日期字符串 = ['2008-07-18 14:36:53.494013','2008-07-2014:37:01.508990', '2008-07-28 14:49:26.183256']

dates = [dateutil.parser.parse(s) for s in datestrings]

一旦我们有了 datetime 对象,为了让 Matplotlib 使用它们,我们必须将它们转换为浮点数,表示自 0001-01-01 00:00:00 UTC 以来的天数。

为此,Matplotlib 本身在 matplotlib.dates 模块中提供了几个帮助函数:

• date2num():此函数将一个或一系列日期时间对象转换为浮点值,表示自 0001-01-01 00:00:00 UTC 以来的天数(小数部分表示小时、分钟和秒)

(摘自 Matplotlib for Python Developers,Sandro Tosi,Ed. PACKT PUBLISHING 2009。第 95 页)

所以我不明白为什么 datetime 对象 date2num 函数期望具有以下形式:

2008-07-20 14:37:01.508990

虽然我正在生成的是这种形式:

2018-02-03 13:30:00+00:00

我得到的错误是:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-7d0a84cb48da> in <module>
     20 
     21 # Convert to matplotlib required
---> 22 mpl_times =  mpl.dates.date2num(times)
     23 
     24 plt.figure()

times 是:

<class 'numpy.ndarray'>
times
['2018-01-12 07:00:00+01:00', '2018-01-12 07:01:00+01:00', '2018-01-12 07:02:00+01:00' ..... ]

如何将我的格式转换为date2num 期望的格式?

【问题讨论】:

  • 你没有显示你得到的错误(只是回溯的开始)。也没有显示您如何创建times。 Datetime 对象没有任何格式。您使用从某些未知操作中获得的 string 并尝试将其用作日期时间对象。相反,您需要直接使用 datetime 对象。

标签: python datetime matplotlib timezone pytz


【解决方案1】:

如何导入 matplotlib.dates? 可以试试吗

    from matplotlib import dates as dt
    ....
    ....
    mpl_times =  dt.date2num(times)

以下代码对我有用

    from datetime import datetime
    import pytz
    from matplotlib import dates as dt

    _year = 2018
    _month = 2
    _day = 3
    _hour = 14
    _minute = 30
    csv_timezone = pytz.timezone('Europe/Berlin')

    csv_dt = datetime(_year, _month, _day, _hour, _minute)
    print('csv_dt')
    print(csv_dt)

    utc_dt = csv_timezone.localize(csv_dt).astimezone(pytz.utc)
    print('utc_dt')
    print(utc_dt)
    print (dt.date2num(utc_dt))

输出为736728.5625

【讨论】:

  • import matplotlib as mpl 所以是同一个包
  • 你试过from matplotlib import dates as dt吗? (stackoverflow.com/questions/9439480/from-import-vs-import)
  • 它对我有用。导入为import matplotlib as mpl 时不起作用。收到AttributeError。不知道,为什么它不适合你。
猜你喜欢
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2014-10-28
相关资源
最近更新 更多