Создание объектов даты и времени в UTC без часового пояса, которые могут быть импортированы Matplotlib - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть список 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.Который, согласно документации, ожидает следующий объект datetime:

Форматирование даты Обычно в программах Python даты представляются в виде объектов datetime, поэтому сначала нужно преобразовать другие значения данных в объекты datetime, иногдас помощью сопутствующего модуля dateutil, например:

импорт datetime

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

или

import dateutil.parser

datestrings = ['2008-07-18 14: 36: 53.494013', '2008-07-2014: 37: 01.508990', '2008-07-28 14: 49: 26.183256 ']

date = [dateutil.parser.parse (s) для s в строках даты]

Когда у нас есть объекты datetime, чтобы позволить Matplotlib использовать их, мы должны преобразовать их в числа с плавающей точкой, которые представляют количество дней с 0001-01-01 00:00:00 UTC.

Для этого сам Matplotlib предоставляет несколько вспомогательных функций, содержащихся в matplotlib.модуль дат:

• date2num (): эта функцияпреобразует один или последовательность объектов datetime в значения с плавающей точкой, представляющие дни с 0001-01-01 00:00:00 UTC (дробные части представляют часы, минуты и секунды)

(выдержка из Matplotlib для разработчиков на PythonСандро Тоси, под ред.PACKT PUBLISHING 2009. Page 95)

Поэтому я не понимаю, почему функция datetime object 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?

1 Ответ

0 голосов
/ 04 февраля 2019

Как вы импортируете 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

...