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

标签 python numpy datetime64

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

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

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

虽然这会生成我需要的日期列表,但我在文档/谷歌中找不到如何将它们拆分为 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))一样,这会创建一个跨越一系列值的一维数组。需要明确的是,数组包含表示日期值的数值( float )。 ndarray 代码使用特定的 dtype 来解释这些数字。显示数组时,它将数据呈现为这些数据字符串(由 dtype[D] 部分指定)。

您需要什么类型的列?

与任何一维数组一样,您可以使用以下方法创建体积向量:

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

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

对于不同的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)

或者结构化数组“堆叠”:

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

关于python - 如何将 np.datetime64 信息分成不同的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45086131/

相关文章:

python - 比较 pandas 中的日期时间的最快方法是什么?

python - 为什么在调用 '.values' 时 pd.Timestamp 转换为 np.datetime64 ?

python - 稀疏矩阵减法

python - 当 numpy 数组不包含零时运行循环

python - 给定任意数量的较小方阵创建方阵的算法

python - 提取 Pandas 中日期时间类型列的第一天

python - 通过查找其他行中的值创建新的 pandas 数据框列

python - 如何使用像 len[arry]-1) 这样的 python 在文本文件中获取最后一行作为索引?

python - Grpc python 客户端服务器流式传输未按预期工作

python - 将 MATLAB 矩阵对象转换为 Python NumPy 数组