使用Numpy对含日期时间列的文本数组按指定时间列排序
问题描述
我读取了一个文本文件,内容是如下格式的字符串数组:
['XXXX_10 SATLIT 9.900 2024/319 12:22:00 2024/319 12:31:03 TR2 # SOH' 'XXXX_10 SATLIT 9.900 2024/319 12:22:00 2024/319 12:31:03 TR2 # SOH' 'XXXX_10 SATLIT 9.900 2024/319 12:55:03 2024/319 13:17:38 TR2 # SOH' 'XXXX_10 SATLIT 9.900 2024/319 12:55:03 2024/319 13:17:38 TR2 # SOH' 'XXXX_10 SATLIT 9.900 2024/319 14:33:50 2024/319 14:45:00 TR2 # SOH' 'XXXX_10 SATLIT 9.900 2024/319 14:33:50 2024/319 14:45:00 TR2 # SOH' 'XXXX_10 SATLIT 9.900 2024/319 19:47:00 2024/319 20:08:37 TR2 # SOH' 'XXXX_11 SATLIT 9.900 2024/319 12:22:00 2024/319 12:31:03 TR2 # SOH' 'XXXX_11 SATLIT 9.900 2024/319 12:22:00 2024/319 12:31:03 TR2 # SOH' 'XXXX_11 SATLIT 9.900 2024/319 12:55:03 2024/319 13:16:47 TR2 # SOH' 'XXXX_11 SATLIT 9.900 2024/319 12:55:03 2024/319 13:16:47 TR2 # SOH' 'XXXX_11 SATLIT 9.900 2024/319 14:33:50 2024/319 14:45:00 TR2 # SOH' 'XXXX_11 SATLIT 9.900 2024/319 14:33:50 2024/319 14:45:00 TR2 # SOH' 'XXXX_11 SATLIT 9.900 2024/319 19:47:00 2024/319 20:07:47 TR2 # SOH' 'XXXX_12 SATLIT 9.900 2024/319 19:47:00 2024/319 20:13:11 TR2 # SOH' 'XXXX_12 SATLIT 9.900 2024/319 19:47:00 2024/319 20:13:11 TR2 # SOH' 'XXXX_12 SATLIT 9.900 2024/319 21:29:03 2024/319 22:28:00 TR2 # SOH' 'XXXX_12 SATLIT 9.900 2024/319 21:29:03 2024/319 22:28:00 TR2 # SOH' 'XXXX_12 SATLIT 9.900 2024/320 01:32:00 2024/320 01:54:06 TR2 # SOH' 'XXXX_12 SATLIT 9.900 2024/320 01:32:00 2024/320 01:54:06 TR2 # SOH' 'XXXX_12 SATLIT 9.900 2024/320 02:37:13 2024/320 02:54:27 TR2 # SOH' 'XXXX_6 SATLIT 9.900 2024/319 11:44:00 2024/319 12:00:00 TR2 # SOH' 'XXXX_6 SATLIT 9.900 2024/319 11:44:00 2024/319 12:00:00 TR2 # SOH' 'XXXX_6 SATLIT 9.900 2024/319 12:55:03 2024/319 13:41:19 TR2 # SOH' 'XXXX_6 SATLIT 9.900 2024/319 12:55:03 2024/319 13:41:19 TR2 # SOH' 'XXXX_6 SATLIT 9.900 2024/319 15:05:00 2024/319 15:11:00 TR2 # SOH' 'XXXX_6 SATLIT 9.900 2024/319 15:05:00 2024/319 15:11:00 TR2 # SOH' 'XXXX_6 SATLIT 9.900 2024/319 18:32:00 2024/319 19:02:03 TR2 # SOH']
每行的第4、5列代表起始时间段,我想使用Numpy按这个起始时间段对数组排序,但尝试了以下代码没得到预期结果:
searchfile = open('SATLIT_schedule.txt') d = np.array(searchfile.readlines()) sortd = np.sort(d, 3) print sortd
解决方案
你的代码问题在于直接对一维字符串数组调用np.sort并指定轴3,既不符合数组维度逻辑,也无法正确解析时间字段的排序规则——直接排序字符串会按字典序处理,不能反映时间先后。
正确的处理步骤如下:
- 预处理数据:读取文件内容,清理换行符并拆分每行的字段。
- 转换时间格式:提取每行的起始时间字段,转换为可排序的
datetime对象。 - 按时间排序:用时间字段的排序索引重新排列原数组。
示例代码:
import numpy as np from datetime import datetime # 读取并预处理文件内容 with open('SATLIT_schedule.txt', 'r') as f: lines = [line.strip() for line in f if line.strip()] d = np.array(lines) # 定义函数提取并转换起始时间 def parse_start_time(line): parts = line.split() # 拼接日期与时间字符串 time_str = f"{parts[3]} {parts[4]}" # %j 用于解析"一年中的第几天"格式 return datetime.strptime(time_str, "%Y/%j %H:%M:%S") # 生成时间数组 time_array = np.array([parse_start_time(line) for line in d]) # 获取时间排序的索引,按升序排列 sorted_indices = np.argsort(time_array) # 用索引对原数组排序 sorted_data = d[sorted_indices] # 输出排序结果 for line in sorted_data: print(line)
关键说明
- 使用
%j格式符解析2024/319这类“年份/年内天数”的日期格式。 np.argsort返回的是排序后的索引,用它可以保留原行的完整数据,仅按时间顺序重新排列。- 用
with语句管理文件,能自动处理文件关闭,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Nathan E Miller
相关产品推荐
相关产品推荐

