Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 增加datetime数组的年份而不使用for循环_Python_Python 2.7_Numpy_Datetime_Numpy Ndarray - Fatal编程技术网

Python 增加datetime数组的年份而不使用for循环

Python 增加datetime数组的年份而不使用for循环,python,python-2.7,numpy,datetime,numpy-ndarray,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.

我有一个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

干杯

在使用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(我知道,可怜的…),但你知道的是:在使用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(我知道,可怜…),但你知道的是:Dnumpy不支持“1年”作为时间增量,因为这可能是365或366天。如果您愿意使用熊猫,您可以使用with,它支持基于年份的补偿:

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,您可以在将
对象
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天不匹配。

NumPy不支持将“1年”作为时间增量,因为这可能是365天或366天。如果您愿意使用熊猫,您可以使用with,它支持基于年份的补偿:

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,您可以在将
对象
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天不匹配。

您的答案非常有效!尽管我尝试了第一个答案,并注意到任何闰年的数据都是不正确的。i、 e月份1月/2月的日值为14,而其他月份的日值为15..@MaxCollier,是的,这正是使用365天修复的问题所在。据我所知,还没有一个天然的NumPy解决方案。你的答案非常有效!尽管我尝试了第一个答案,并注意到任何闰年的数据都是不正确的。i、 e月份1月/2月的日值为14,而其他月份的日值为15..@MaxCollier,是的,这正是使用365天修复的问题所在。据我所知,没有原生的NumPy解决方案。