Как получить месяцы от объекта np.datetime64, НЕ используя панд - PullRequest
0 голосов
/ 31 марта 2019

У меня есть такой массив:

dt64 = array(['1970-01-01', '1970-01-02', '1970-02-03', '1970-02-04',
      '1970-03-05', '1970-03-06', '1970-04-07', '1970-04-08',
      '1970-05-09', '1970-05-10', '1970-06-11', '1970-06-12',
      '1970-07-13', '1970-07-14'], dtype='datetime64[D]')

Теперь я хочу отобразить некоторые данные, связанные с одним элементом массива. На рисунке, который я хочу построить с помощью matplotlib, мне нужно нарисовать линию, которая меняет цвет в течение нескольких месяцев.

Я хочу нарисовать месяцы март, чтобы пометить оранжевым, а остальные синим.

Я думаю, мне нужно сделать две plt.plot строки, одну для оранжевой линии и одну для синей линии.

Моя проблема сейчас в том, что я изо всех сил пытаюсь нарезать эти объекты datetime64 таким образом, чтобы они возвращали месяц, чтобы сравнить его с требуемыми месяцами.

Пока у меня есть:

import numpy as np
from matplotlib import pyplot as plt

def md_plot(dt64=np.array, md=np.array):
    """Erzeugt Plot der Marsdistanz (y-Achse) zur Zeit (x-Achse)."""
    plt.style.use('seaborn-whitegrid')

    y, m, d = dt64.astype(int) // np.c_[[10000, 100, 1]] % np.c_[[10000, 100, 100]]
    dt64 = y.astype('U4').astype('M8') + (m-1).astype('m8[M]') + (d-1).astype('m8[D]')

    plt.plot(dt64, md, color='orange', label='Halbjahr der steigenden Temperaturen')
    plt.plot(dt64, md, color='blue', label='Halbjahr der fallenden Temperaturen')

    plt.xlabel("Zeit in Jahren\n")
    plt.xticks(rotation = 45)
    plt.ylabel("Marsdistanz in AE\n(1 AE = 149.597.870,7 km)")

plt.figure('global betrachtet...') # diesen Block ggf. auskommentieren
#plt.style.use('seaborn-whitegrid')
md_plot(master_array[:,0], master_array[:,1]) # Graph

plt.show()
plt.close()

Эта идея, похоже, работает, но не будет работать для всего массива:

In [172]: dt64[0].astype(datetime.datetime).month
Out[172]: 1

Я действительно стараюсь избегать Панд, потому что я не хочу раздувать свой сценарий, когда есть способ выполнить задачу, используя модули, которые я уже использую. Я также читал, что это уменьшит скорость здесь .

Ответы [ 4 ]

1 голос
/ 02 апреля 2019

Преобразование в python datetime на промежуточном этапе:

from datetime import datetime
import numpy as np

datestrings = np.array(["18930201", "19840404"])
months = np.array([datetime.strptime(d, "%Y%m%d").month for d in datestrings])

print(months)

# out: [2 4]
0 голосов
/ 31 марта 2019

Моя версия numpy может быть устаревшей, но когда я запустил np.datetime64(dt64[0]), я получил numpy.datetime64 ('1970-01')

Чтобы получить только месяц (если это то, что вы ищете)попробуй:

np.datetime_as_string(dt64[0]).split('-')[1]
0 голосов
/ 01 апреля 2019

Это решение подходит мне лучше всего:

dt64[(dt64.astype('M8[M]') - dt64.astype('M8[Y]')).view(int) == 2]

Спасибо Полу Панцеру.

0 голосов
/ 31 марта 2019

Если я правильно вас понял, это сделало бы:

[np.datetime64(i,'M') for i in dt64]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...