如何转换numpy datetime64数组的日期格式?能否初始化时指定格式?
日期格式转换问题解答
1. 实现目标格式的方法
numpy的datetime64数组是数值型的日期存储,要转成Jan-01-2018这种字符串格式,有两种常用方式:
方式一:numpy原生处理
先把数组转成Python的datetime对象数组,再用vectorize批量格式化:
import numpy as np dates = np.arange("2018-01-01", "2021-12-31", dtype="datetime64[D]") # 转换为datetime对象数组 date_objs = dates.astype("datetime64[ns]").astype(object) # 批量生成格式化字符串 formatter = np.vectorize(lambda dt: dt.strftime("%b-%d-%Y")) formatted_dates = formatter(date_objs)
方式二:用pandas简化操作
如果可以引入pandas,处理起来更简洁:
import numpy as np import pandas as pd dates = np.arange("2018-01-01", "2021-12-31", dtype="datetime64[D]") formatted_dates = pd.to_datetime(dates).strftime("%b-%d-%Y").to_numpy()
2. 初始化时能否直接指定目标格式?
不行。numpy.arange生成的datetime64数组是数值型存储,本质是记录时间戳的数值,不是字符串。初始化只能设置日期的精度(比如[D]代表按天),没法直接定义显示的字符串格式——格式转换是把数值型日期转成字符串时才需要做的步骤。
3. 你写的循环代码无法实现转换
你的代码存在几个问题:
- numpy的
datetime64对象没有month属性、replace方法,也不能直接调用strftime,这些都是Python标准库datetime.datetime对象的特性 - 就算转成了
datetime对象,replace方法是用来替换年/月/日的数值,不能传入字符串格式的月份缩写,用法完全错误
如果想用循环实现,正确写法如下:
import numpy as np dates = np.arange("2018-01-01", "2021-12-31", dtype="datetime64[D]") formatted_dates = [] for date in dates: # 转成Python datetime对象 dt = date.astype(object) # 格式化字符串 formatted_dates.append(dt.strftime("%b-%d-%Y")) # 转成numpy数组(可选) formatted_dates = np.array(formatted_dates)
内容的提问来源于stack exchange,提问作者dartigan
相关产品推荐
相关产品推荐

