date = np.array(['2023-01-01', '2023-02-02', '2023-03-03'])
months = np.array([3, 2, 1])
months = np.array([np.timedelta64(month, 'M') for month in months])
expectation = date + months ?????
# the array I want to get
# expectation -> np.array(['2023-04-01', '2023-04-02', '2023-04-03'])
我想添加两个变量“日期”和“月份”。expectation
变量是我想要得到的。
怎么做?
2条答案
按热度按时间yfwxisqw1#
注意:这个答案的第1部分假设数组有一个
dtype='datetime64[D]'
,与RJ's answer的区别在于,我展示了一种向量化的方法来构建最终结果,因为他们的答案在最后一步中以列表解析的形式存在一个鬼鬼祟祟的循环,在那里他们构建了expectation
。如果输入数组有一个
dtype='U10'
,就像运行date = np.array(['2023-01-01', '2023-02-02', '2023-03-03'])
语句一样,跳到第2部分。第一部分:如果
date.dtype == 'datetime64[D]'
计算
new_years
和new_months
,就像RJ在他们的答案中显示的那样:然后,通过颠倒将日期分解为年、月和日的步骤来构造结果:
这将为您提供所需的数组
第二部分:如果
date.dtype == '<U10'
对于RJ将输入字符串数组拆分为日期、月份和年份的方法的替代方案:你可以直接从字符串数组的字符中获取这些,而不是转换为日期时间数组:
首先,转换为
(N, 10)
字符数组:接下来,通过对这个数组进行切片来获得年、月和日:
由于所有这些数组都是列向量,让我们将
months
转换为列向量,这样numpy就不会将结果广播到方阵中:然后,创建
new_months
和new_years
,如下所示:最后,建立你的新日期:
创建一个与
date_chars
大小相同的字符数组,但充满了字符'0'
。在正确位置插入连字符:在下一步之前,让我们定义一个助手函数,它将接受一个数字数组(天或月),并返回一个填充零的字符数组:
然后,插入年、月和日期:
最后,将它们连接成一个字符串:
z6psavjg2#
因为月份的长度不同,所以使用numpy来抵消日期可能会很棘手。但是,您可以通过提取年、月和日组件,执行加法,然后重新组合日期来实现这一点。
这里有一个方法:
输出量: