7

我想从年、月和日的一维向量创建 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()并取回一个 vector [3, 20, 14, 27]

4

3 回答 3

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]')
于 2014-10-30T22:10:27.567 回答
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),它适用于整个数组或单个对象。你做哪一个可能取决于你如何使用数据。

于 2012-11-23T21:42:58.737 回答
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]

当然,您可以将日期时间“下限”为“天”并返回一个 numpy 数组.values

于 2018-05-08T11:09:20.443 回答