如何将多个整数类型NumPy数组转换为指定格式化字符串的NumPy数组
超大范围日期数组向量化格式化解决方案
方案1:原生向量化实现(性能最优)
使用NumPy内置的numpy.char.mod函数即可实现需求,该函数是原生向量化实现,对标Python原生的%格式化语法,不需要依赖任何日期处理库,完美支持公元前年份。
import numpy as np # 示例输入 years = np.array([-1000, 0, 1000, 2000]) months = np.array([1, 2, 3, 5]) days = np.array([1, 11, 21, 31]) # 向量化格式化,%02i和你要求的%2.2i效果完全一致,不足两位自动补前导零 datestr_array = np.char.mod('%i-%02i-%02i', np.stack([years, months, days], axis=1))
运行后输出结果为:
array(['-1000-01-01', '0-02-11', '1000-03-21', '2000-05-31'], dtype='<U11')
完全符合格式要求。
方案2:灵活自定义实现(兼容性好)
如果需要后续修改格式化规则,或者使用的NumPy版本较老,可以用np.vectorize包装标量格式化逻辑,代码如下:
import numpy as np years = np.array([-1000, 0, 1000, 2000]) months = np.array([1, 2, 3, 5]) days = np.array([1, 11, 21, 31]) def format_date(y, m, d): return '%i-%02i-%02i' % (y, m, d) # 生成向量化函数 v_format_date = np.vectorize(format_date) datestr_array = v_format_date(years, months, days)
注意事项
- 两种方案都不依赖Python内置
datetime和Pandas的DateTimeIndex,支持的年份范围无限制,完全覆盖公元前2000年到公元3000年的需求。 - 性能上方案1远优于方案2,处理百万级以上数据优先选择方案1。
内容的提问来源于stack exchange,提问作者AstroFloyd
相关产品推荐
相关产品推荐

