如何将Unix时间戳转换为字符串?以及仅使用Numpy实现10000×3数组的CSV保存
用纯Numpy实现数组转CSV并处理时间戳转换
没问题,我会帮你用纯Numpy完成这个任务,同时详细说明Unix时间戳转字符串的实现方式。
完整实现代码
import numpy as np import time # 1. 生成数组并正确赋值时间戳 arr = np.random.randn(10000, 3) base_time = time.time() # 给第一列赋值 time.time() + i,i从0到9999 arr[:, 0] = base_time + np.arange(arr.shape[0]) # 2. 将Unix时间戳转换为日期时间字符串 # 定义向量化函数,批量处理时间戳转字符串 timestamp_to_datetime = np.vectorize( lambda ts: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ts)) ) datetime_strs = timestamp_to_datetime(arr[:, 0]) # 3. 构建混合数据类型的结构化数组 # 因为普通Numpy数组只能有单一数据类型,所以用结构化数组来存储字符串+浮点 structured_arr = np.core.records.fromarrays( [datetime_strs, arr[:, 1], arr[:, 2]], dtype=[('datetime', 'U19'), ('col2', 'f8'), ('col3', 'f8')] ) # 4. 保存为CSV文件 np.savetxt( 'output.csv', structured_arr, fmt='%s,%.6f,%.6f', # 指定每列的格式:字符串,浮点保留6位小数 delimiter=',', header='datetime,col2,col3', # 添加表头 comments='' # 去掉默认的#注释符 )
关键步骤详解
1. 正确生成时间戳序列
你原来的代码里arr[:,0] = time.time() + 1只会给所有行的第一列赋值同一个时间戳+1,这里我们用np.arange(arr.shape[0])生成0到9999的序列,加上基准时间,就能得到每行递增1秒的时间戳。
2. Unix时间戳转字符串的方法
要批量处理Numpy数组里的时间戳,最方便的是用np.vectorize()把普通的Python时间处理函数转换成能作用于整个数组的向量化函数:
time.localtime(ts):把Unix时间戳转换为本地时间的struct_time对象time.strftime(format, struct_time):把struct_time格式化为指定的字符串(这里用%Y-%m-%d %H:%M:%S对应年-月-日 时:分:秒)np.vectorize()让这个转换逻辑可以一次性作用于整个arr[:,0]数组,效率比Python循环高很多。
3. 处理混合数据类型
普通的Numpy ndarray只能存储单一数据类型,而我们需要第一列是字符串,后两列是浮点,所以用np.core.records.fromarrays()创建结构化数组:
- 传入每列的数据列表
- 指定
dtype参数,定义每列的名称和数据类型:'U19'表示长度19的字符串(刚好匹配YYYY-MM-DD HH:MM:SS的长度),'f8'表示64位浮点数。
4. 保存CSV文件
用np.savetxt()保存时:
fmt参数指定每列的输出格式,%s对应字符串,%.6f对应保留6位小数的浮点数header添加CSV表头,comments=''避免表头被加上#注释符delimiter=','指定逗号作为分隔符,符合CSV格式要求
另一种更高效的时间转换方式(可选)
如果你的数据量很大,np.vectorize()本质还是循环,你可以用Numpy的datetime64类型来处理,效率更高:
# 用numpy原生datetime处理 datetime_arr = np.datetime64('1970-01-01') + arr[:,0].astype('timedelta64[s]') datetime_strs = datetime_arr.astype('U19')
这种方式完全用Numpy原生操作,比vectorize更高效,结果和之前的方法一致。
内容的提问来源于stack exchange,提问作者jett chen
相关产品推荐
相关产品推荐

