如何从日、月、年三个numpy数组构建numpy.datetime64数组?
嘿,我完全懂你遇到的困扰——直接把日、月、年三个数组塞进np.datetime64()确实跑不通,毕竟官方文档里它主要支持字符串或者单个数值输入。不过别慌,有几个实用的方案能帮你把这三个分量整合成datetime64数组!
方法1:构造标准日期字符串再转换
最直观的方式就是先把三个数组格式化成统一的日期字符串(比如YYYY-MM-DD),再转成datetime64类型。numpy的字符数组操作可以轻松搞定批量拼接:
import numpy as np # 示例数组(替换成你自己的即可) years = np.array([2022, 2023, 2024]) months = np.array([10, 1, 12]) days = np.array([5, 8, 25]) # 把月、日补成两位数(避免出现2023-1-8这种不规范格式) months_str = np.char.zfill(months.astype(str), 2) days_str = np.char.zfill(days.astype(str), 2) # 拼接成YYYY-MM-DD格式的字符串数组 date_strings = years.astype(str) + '-' + months_str + '-' + days_str # 转换为datetime64数组 date_array = np.array(date_strings, dtype='datetime64[D]') print(date_array)
输出结果会是:['2022-10-05' '2023-01-08' '2024-12-25'],完全符合需求。
方法2:基于基准日期计算天数差
如果你不想碰字符串,可以利用numpydatetime64的基准日(1970-01-01),先计算每个日期距离基准日的天数,再转成日期类型。这里可以用np.vectorize把单个日期的计算逻辑批量应用到数组上:
import numpy as np from datetime import datetime # 定义单个日期转epoch天数的函数 def get_days_since_epoch(year, month, day): return (datetime(year, month, day) - datetime(1970, 1, 1)).days # 向量化函数,支持数组输入 vec_get_days = np.vectorize(get_days_since_epoch) days_epoch = vec_get_days(years, months, days) # 转成datetime64数组 date_array = np.array(days_epoch, dtype='datetime64[D]') print(date_array)
这个方法绕开了字符串处理,但需要依赖Python标准库的datetime来计算天数,适合对字符串操作有顾虑的场景。
方法3:用Pandas简化操作(如果项目允许)
要是你已经在使用Pandas,那这个方法会更省心——Pandas的to_datetime直接支持传入年、月、日的数组字典,一键转换后再转成numpy数组即可:
import pandas as pd import numpy as np years = np.array([2022, 2023, 2024]) months = np.array([10, 1, 12]) days = np.array([5, 8, 25]) # 直接构造日期数组 date_array = pd.to_datetime({'year': years, 'month': months, 'day': days}).to_numpy() print(date_array)
一行核心代码就能搞定,非常简洁。
内容的提问来源于stack exchange,提问作者ARF
相关产品推荐
相关产品推荐

