You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,既不符合数组维度逻辑,也无法正确解析时间字段的排序规则——直接排序字符串会按字典序处理,不能反映时间先后。

正确的处理步骤如下:

  1. 预处理数据:读取文件内容,清理换行符并拆分每行的字段。
  2. 转换时间格式:提取每行的起始时间字段,转换为可排序的datetime对象。
  3. 按时间排序:用时间字段的排序索引重新排列原数组。

示例代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:44:52