如何将 np.datetime64 信息分成不同的列?
How can I separate np.datetime64 information into different columns?
我正在尝试创建一个日期数组,其列为:day、month 和 year 在两个特定日期之间(时间增量 = 1 天)。我知道这一定很简单,但我找不到类似的例子。
我发现我可以使用 numpy datetime64 创建日期数组,如下所示:
import numpy as np
dates = np.arange(np.datetime64('2010-01-01'),np.datetime64('2014-12-31'))
虽然这会生成我需要的日期列表,但我无法在 documentation/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
来解释这些数字。当显示数组时,它将数据呈现为这些数据字符串(由 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)
或者结构化数组'stacking':
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]')])
如果它不必在 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)
我正在尝试创建一个日期数组,其列为:day、month 和 year 在两个特定日期之间(时间增量 = 1 天)。我知道这一定很简单,但我找不到类似的例子。
我发现我可以使用 numpy datetime64 创建日期数组,如下所示:
import numpy as np
dates = np.arange(np.datetime64('2010-01-01'),np.datetime64('2014-12-31'))
虽然这会生成我需要的日期列表,但我无法在 documentation/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
来解释这些数字。当显示数组时,它将数据呈现为这些数据字符串(由 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)
或者结构化数组'stacking':
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]')])
如果它不必在 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)