如何将np.datetime64信息分成不同的列?

时间:2017-07-13 16:16:25

标签: python numpy datetime64

我试图在两个特定日期(时间)之间创建一个日期数组,其列数为: day month year delta = 1天)。我知道这一定很简单,但我找不到类似的例子。

我发现我可以使用numpy datetime64创建日期数组,如下所示:

import numpy as np
dates = np.arange(np.datetime64('2010-01-01'),np.datetime64('2014-12-31'))

虽然这会生成我需要的日期列表,但我无法在文档/ google中找到如何将它们拆分成numpy数组中的列。

有什么想法吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

In [25]: dates = np.arange(np.datetime64('2010-01-01'),np.datetime64('2014-12-31'))
In [26]: dates
Out[26]: 
array(['2010-01-01', '2010-01-02', '2010-01-03', ..., '2014-12-28',
       '2014-12-29', '2014-12-30'], dtype='datetime64[D]')
In [27]: dates.shape
Out[27]: (1825,)

与常规np.arange(例如np.arange(1825))一样,这会创建一个跨越一系列值的1d数组。要清楚,数组包含表示日期值的数值(浮点数)。 ndarray代码使用特定的dtype来解释这些数字。显示数组时,它会将数据呈现为这些数据字符串(由[D]的{​​{1}}部分指示)。

您需要哪种色谱柱?

与任何1d数组一样,您可以使用:

创建一个体积矢量
dtype
In [28]: dates[:,None]
Out[28]: 
array([['2010-01-01'],
       ['2010-01-02'],
       ['2010-01-03'],
       ..., 
       ['2014-12-28'],
       ['2014-12-29'],
       ['2014-12-30']], dtype='datetime64[D]')

生成alist = dates.tolist() In [59]: alist[:10] Out[59]: [datetime.date(2010, 1, 1), datetime.date(2010, 1, 2), datetime.date(2010, 1, 3), datetime.date(2010, 1, 4), datetime.date(2010, 1, 5), datetime.date(2010, 1, 6), datetime.date(2010, 1, 7), datetime.date(2010, 1, 8), datetime.date(2010, 1, 9), datetime.date(2010, 1, 10)] 个对象的列表。我们迭代地从这些对象中提取年,月,日。

datetime

In [66]: np.array([[x.year, x.month, x.day] for x in alist]) Out[66]: array([[2010, 1, 1], [2010, 1, 2], [2010, 1, 3], ..., [2014, 12, 28], [2014, 12, 29], [2014, 12, 30]]) dtype没有确切的等价物。我们可以将它们转换成各种单位,并采取差异。

np.datetime64

使用不同的In [68]: yrs = dates.astype('datetime64[Y]') In [69]: yrs Out[69]: array(['2010', '2010', '2010', ..., '2014', '2014', '2014'], dtype='datetime64[Y]') In [70]: mths = dates.astype('datetime64[M]')-yrs In [71]: mths Out[71]: array([ 0, 0, 0, ..., 11, 11, 11], dtype='timedelta64[M]') In [72]: days = dates - dates.astype('datetime64[M]') In [73]: days Out[73]: array([ 0, 1, 2, ..., 27, 28, 29], dtype='timedelta64[D]') ,我们无法直接连接这些内容。但是将它们转换为int我们可以得到相同的2d数组:

dtypes

(年份需要抵消)。

In [76]: np.stack((yrs.astype(int), mths.astype(int), days.astype(int)),axis=1)
Out[76]: 
array([[40,  0,  0],
       [40,  0,  1],
       [40,  0,  2],
       ..., 
       [44, 11, 27],
       [44, 11, 28],
       [44, 11, 29]])

或结构化阵列'堆叠':

In [77]: np.stack((yrs.astype(int)+1970, mths.astype(int), days.astype(int)),axis=1)

答案 1 :(得分:2)

如果它不必是Numpy数组,你可以使用Pandas -

import numpy as np
from pandas import DatetimeIndex
dates = DatetimeIndex(np.arange(np.datetime64('2010-01-01'),np.datetime64('2014-12-31')))

date_cols = [[d.year, d.month, d.day] for d in dates]

否则,我会避免numpy并使用datetime完成整个事情 -

from datetime import datetime, timedelta

st = datetime(2010, 1, 1) # or datetime.strptime("2010-01-01", "%Y-%m-%d")
ed = datetime(2014, 12, 31) # or datetime.strptime("2014-12-31", "%Y-%m-%d")

count =  ed - st
date_cols = []
for d in range(count.days+1):
    date = st + timedelta(days=d)
    date_cols.append([date.year, date.month, date.day])
print(date_cols)
相关问题