在不使用 for 循环的情况下增加日期时间数组的年份
Increase year of datetime array without using for loop
我有一个 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(我知道,可悲......)但你知道是的 :D
NumPy 不支持“1 年”作为时间增量,因为它可以是 365 或 366 天。如果你愿意使用Pandas,你可以使用pd.to_datetime
with pd.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 天的不匹配。
我有一个 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(我知道,可悲......)但你知道是的 :D
NumPy 不支持“1 年”作为时间增量,因为它可以是 365 或 366 天。如果你愿意使用Pandas,你可以使用pd.to_datetime
with pd.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 天的不匹配。