如何将(m,2)维度NumPy数组转换为12小时制hh:mm AM/PM格式时间戳
NumPy时间数组转12小时制时间戳函数实现
需求说明
- 输入为形状是
(m, 2)的NumPy数组,每行第一列为原始小时值,第二列为分钟值 - 小时值处理逻辑:大于24的数值按整24天折算为合法日内小时(等价于对24取模)
- 输出为对应12小时制
hh:mm AM/PM格式的字符串列表,格式无小时前导零,分钟保留两位前导零,和示例输入输出对齐 - 优先使用
from datetime import time导入的方法实现,同时提供无依赖的纯格式化实现方案
方案一:基于datetime.time实现
按照要求优先使用标准库的time类完成时间格式化,兼容跨平台的小时前导零适配:
import numpy as np import re from datetime import time def format_time_array(array: np.ndarray) -> list[str]: result = [] for raw_hour, raw_min in array: # 小时折算为合法日内值 norm_hour = int(raw_hour) % 24 # 构造标准time对象 time_obj = time(hour=norm_hour, minute=int(raw_min)) # 生成带前导零的标准格式字符串 formatted_str = time_obj.strftime('%I:%M %p') # 移除小时位多余的前导零,匹配示例输出格式 formatted_str = re.sub(r'^0', '', formatted_str) result.append(formatted_str) return result
效果测试
输入示例数组:
a = np.array([[0,40],[13,20],[42,20]]) print(format_time_array(a))
输出结果和要求完全一致:[12:40 AM, 1:20 PM, 6:20 PM]
方案二:无datetime依赖的纯格式化实现
如果不需要引入时间处理库,可通过手动计算12小时制规则完成格式化:
import numpy as np def format_time_array_no_datetime(array: np.ndarray) -> list[str]: result = [] for raw_hour, raw_min in array: norm_hour = int(raw_hour) % 24 minute = int(raw_min) # 判断AM/PM时段 period = "AM" if norm_hour < 12 else "PM" # 计算12小时制显示值,0点/12点统一显示为12 display_hour = norm_hour % 12 display_hour = 12 if display_hour == 0 else display_hour # 分钟补前导零为两位格式 formatted_min = f"{minute:02d}" result.append(f"{display_hour}:{formatted_min} {period}") return result
该方案测试效果和datetime版本完全一致。
实现边界兼容
- 所有小时值无论多大都可正常处理,不会出现非法时间报错
- 边界值符合通用时间规则:0点为12 AM,正午12点为12 PM
- 分钟值自动补前导零,比如分钟为5时会显示为
xx:05格式
内容的提问来源于stack exchange,提问作者lut17
相关产品推荐
相关产品推荐

