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

Python 如何将np.datetime64信息分为不同的列?,python,numpy,datetime64,Python,Numpy,Datetime64,我试图创建一个日期数组,其列为:两个特定日期之间的日、月和年(时间增量=1天)。我知道这一定很简单,但我找不到类似的例子 我发现我可以使用numpy datetime64创建日期数组,如下所示: import numpy as np dates = np.arange(np.datetime64('2010-01-01'),np.datetime64('2014-12-31')) 虽然这会生成我需要的日期列表,但我在文档/google中找不到如何将它们拆分为numpy数组中的列 有什么想法吗

我试图创建一个日期数组,其列为:两个特定日期之间的日、月和年(时间增量=1天)。我知道这一定很简单,但我找不到类似的例子

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

import numpy as np
dates = np.arange(np.datetime64('2010-01-01'),np.datetime64('2014-12-31'))
虽然这会生成我需要的日期列表,但我在文档/google中找不到如何将它们拆分为numpy数组中的列

有什么想法吗

提前谢谢

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)
)一样,这会创建一个跨越一系列值的一维数组。要清除,数组包含表示日期值的数值(浮动)。
ndarray
代码使用指定的
dtype
来解释这些数字。当显示数组时,它将数据呈现为这些数据字符串(由
[D]
部分的
dtype
指定)

你需要什么样的栏目

与任何1d阵列一样,可以使用以下各项创建体积向量:

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]')

生成
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]])
np.datetime64
dtype没有完全相同的类型。我们可以把它们转换成不同的单位,然后取不同的值

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]')
对于不同的
d类型
,我们不能直接连接它们。但将它们转换为整数我们可以得到相同的2d数组:

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 [78]: np.rec.fromarrays([yrs, mths, days])
Out[78]: 
rec.array([('2010',  0,  0), ('2010',  0,  1), ('2010',  0,  2), ...,
 ('2014', 11, 27), ('2014', 11, 28), ('2014', 11, 29)], 
          dtype=[('f0', '<M8[Y]'), ('f1', '<m8[M]'), ('f2', '<m8[D]')])
[78]中的
:np.rec.fromArray([yrs,mths,days])
出[78]:
rec.array([('2010',0,0),('2010',0,1),('2010',0,2)。。。,
('2014', 11, 27), ('2014', 11, 28), ('2014', 11, 29)], 

dtype=[('f0','如果它不必在Numpy数组中,则可以使用Pandas--

否则,我会避开numpy,用datetime做所有的事情--


我认为OP在寻找“日、月、年”列IIUC。这也是我的猜测。但如果是这样,应该在问题中明确说明。拆分这些日期并不像看起来那么简单。我找不到一个明确的
get\u month
方法或函数用于这样的数据类型。我们要么使用
datetime
对象列表,要么使用
datetime 64
单位。@hpaulj这正是我需要的。谢谢!:)
In [77]: np.stack((yrs.astype(int)+1970, mths.astype(int), days.astype(int)),axis=1)
In [78]: np.rec.fromarrays([yrs, mths, days])
Out[78]: 
rec.array([('2010',  0,  0), ('2010',  0,  1), ('2010',  0,  2), ...,
 ('2014', 11, 27), ('2014', 11, 28), ('2014', 11, 29)], 
          dtype=[('f0', '<M8[Y]'), ('f1', '<m8[M]'), ('f2', '<m8[D]')])
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]
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)