如何从np.datetime64对象获取月份,而不使用熊猫

时间:2019-03-31 19:43:06

标签: python python-3.x numpy date datetime

我有一个像这样的数组:

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

我真的想避免使用Pandas,因为当有一种方法可以通过使用已经使用的模块来完成任务时,我不想膨胀我的脚本。我还读到它会降低速度here

4 个答案:

答案 0 :(得分:1)

在中间步骤中转换为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]

答案 1 :(得分:0)

如果我对您的理解正确,那么可以这样做:

[np.datetime64(i,'M') for i in dt64]

答案 2 :(得分:0)

我的numpy版本可能已过时,但是当我运行np.datetime64(dt64[0])时,我得到了numpy.datetime64('1970-01')

要获取月份(如果您正在寻找的话),请尝试:

np.datetime_as_string(dt64[0]).split('-')[1]

答案 3 :(得分:0)

This解决方案最适合我:

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

感谢Paul Panzer。