使用NumPy datetime64进行矢量化年/月/日操作

时间:2012-11-23 20:36:32

标签: python numpy

我想从年,月和日的一维向量中创建NumPy datetime64对象的向量,并且反向,即从每日datetime64向量中提取年,月或日的向量。我正在使用NumPy 1.7.0b2。

例如,假设

years = [1990, 1992, 1995, 1994]
months = [1, 6, 3, 7]
days = [3, 20, 14, 27]

现在我想使用这些年,月和日创建长度为4的np.datetime64向量。有没有使用Python循环的方法?

走向另一个方向,假设dates是数据类型np.datetime64的向量,频率是每日。然后我会能够像x.DAYS()这样的东西,并返回一个向量[3, 20, 14, 27]

3 个答案:

答案 0 :(得分:4)

import numpy as np
def compose_date(years, months=1, days=1, weeks=None, hours=None, minutes=None,
              seconds=None, milliseconds=None, microseconds=None, nanoseconds=None):
    years = np.asarray(years) - 1970
    months = np.asarray(months) - 1
    days = np.asarray(days) - 1
    types = ('<M8[Y]', '<m8[M]', '<m8[D]', '<m8[W]', '<m8[h]',
             '<m8[m]', '<m8[s]', '<m8[ms]', '<m8[us]', '<m8[ns]')
    vals = (years, months, days, weeks, hours, minutes, seconds,
            milliseconds, microseconds, nanoseconds)
    return sum(np.asarray(v, dtype=t) for t, v in zip(types, vals)
               if v is not None)

years = [1990, 1992, 1995, 1994]
months = [1, 6, 3, 7]
days = [3, 20, 14, 27]

print(compose_date(years, months, days))

产量

array(['1990-01-03', '1992-06-20', '1995-03-14', '1994-07-27'], dtype='datetime64[D]')

答案 1 :(得分:0)

我不知道如何在没有某种循环的情况下做到这一点,但我在列表理解中对它进行了一些介绍:

years = [1990, 1992, 1995, 1994]
months = [1, 6, 3, 7]
days = [3, 20, 14, 27]
np.array(['{0[0]}-{0[1]}-{0[2]}'.format(x) for x in zip(years, months, days)], dtype='datetime64')

回到另一个方向,您必须将每个项目转换为常规datetime。您可以通过调用适用于整个数组或单个对象的astype(object)来完成此操作。你做哪一个可能取决于你如何使用数据。

答案 2 :(得分:0)

这可以使用pandas完成而无需显式循环(代码来自pandas文档):

 df = pd.DataFrame({'year': [2015, 2016],
   ....:                    'month': [2, 3],
   ....:                    'day': [4, 5],
   ....:                    'hour': [2, 3]})
   ....: 

In [32]: pd.to_datetime(df)
Out[32]: 
0   2015-02-04 02:00:00
1   2016-03-05 03:00:00
dtype: datetime64[ns]

当然,你可以在地板上到期日的日期时间&#39;并使用.values

返回一个numpy数组