【问题标题】:Increase year of datetime array without using for loop在不使用 for 循环的情况下增加日期时间数组的年份
【发布时间】:2019-05-30 14:53:05
【问题描述】:

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

干杯

【问题讨论】:

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


    【解决方案1】:

    NumPy 不支持将“1 年”作为时间增量,因为它可以是 365 或 366 天。如果您愿意使用 Pandas,可以使用 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 天不匹配。

    【讨论】:

    • 您的熊猫回答完美!尽管我尝试了第一个答案并注意到对于任何闰年,数据都是不正确的。即一月/二月月份的日值为 14,而其他月份的日值为 15..
    • @MaxCollier,是的,这正是使用 365 天固定的问题。据我所知,没有原生 NumPy 解决方案。
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2023-02-05
      • 2013-03-29
      • 1970-01-01
      • 2019-08-27
      • 2015-03-06
      相关资源
      最近更新 更多