增加日期时间数组的年份,而不使用for循环

时间:2019-01-04 01:30:25

标签: python python-2.7 numpy datetime numpy-ndarray

我有一个numpy数组,其中有很长的日期时间列表。我想知道是否有一种方法可以在不使用for循环的情况下立即向数组的所有值添加一年?例如。使用一些numpy或datetime模块?

>>> import datetime
>>> import numpy as np

>>> dts.shape
(64580,)

>>> dts[:5]
array([datetime.date(2000, 1, 15), datetime.date(2000, 1, 15),
       datetime.date(2000, 1, 15), datetime.date(2000, 1, 15),
       datetime.date(2000, 1, 15)], dtype=object)

>>> new_dts = somemodule.somefunctionforaddingyearorsomething(dts, year=1)
>>> new_dts
array([datetime.date(2001, 1, 15), datetime.date(2001, 1, 15),
       datetime.date(2001, 1, 15), datetime.date(2001, 1, 15),
       datetime.date(2001, 1, 15)], dtype=object)

注意:每个日期的日期始终设置为第15天,因为日期代表月平均数据。

我已经使用for循环实现了它,但是这可能会降低计算速度。

该代码在这里:

def add_year_to_Datelist(dl):

dts = dl.dates.copy()
for idx, date in enumerate(dts):
    dts[idx] = date.replace(year=date.year + 1)

dl.set_dates(dts)
return dl

欢呼

2 个答案:

答案 0 :(得分:3)

NumPy不支持将“ 1年”作为时间增量,因为这可能是365天或366天。如果您愿意使用熊猫,可以将pd.to_datetimepd.DateOffset一起使用,确实支持基于年份的偏移量:

import datetime, numpy as np, pandas as pd

dts = np.array([datetime.date(2000, 1, 15), datetime.date(2000, 1, 15),
                datetime.date(2000, 1, 15), datetime.date(2000, 1, 15),
                datetime.date(2000, 1, 15)], dtype=object)

dts = (pd.to_datetime(dts) + pd.DateOffset(years=1)).values.astype('datetime64[D]')

# array(['2001-01-15', '2001-01-15', '2001-01-15', '2001-01-15',
#        '2001-01-15'], dtype='datetime64[D]')

使用NumPy,您可以 在将object dtype数组转换为np.datetime64之后添加固定的天数:

dts = dts.astype(np.datetime64) + np.timedelta64(365, 'D')

# array(['2001-01-14', '2001-01-14', '2001-01-14', '2001-01-14',
#        '2001-01-14'], dtype='datetime64[D]')

请注意两个结果之间的1天不匹配。

答案 1 :(得分:2)

在使用for循环时更快地使事情变得困难。但是,使用map会将计算带入C语言,并可以大大加快计算速度。

尝试一下:

def add_year(dl, add=1):
    """Return new list with year increased by specified amount."""
    dts = list(map(lambda date: date.replace(year = date.year + add), dl.dates.copy()))
    return dts

不确定如何获取numpy列表,因为我还没有使用过numpy(我知道,可悲...),但是你知道吗,是的:D