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

Pandas读取文本将年/年内日序/时间转为指定格式datetime列

Pandas处理Themis时间数据格式转换方案

根因说明

之前读取时使用固定4个空格作为分隔符,无法适配源文件中空白分隔长度不固定的情况,导致年、年积日、两组时间字段被错误合并到首列。以下方案同时适配「重新正确读文件」和「已读入错误数据修复」两种场景,全向量化操作处理数十万条记录无性能压力。


步骤1:修正字段拆分,避免列粘连

方案A:重新读取文件(推荐,从源头避免错误)

直接使用正则匹配任意长度空白作为分隔符,读取时直接按原始字段顺序指定列名:

import pandas as pd

df = pd.read_csv(
    "Themis.txt",
    sep=r"\s+",  # 匹配任意数量空格、制表符,替代原固定4空格分隔逻辑
    skiprows=33,
    # 按原始字段顺序指定列名,避免自动识别列名导致的错位
    names=["year", "doy", "time1", "time2", "X", "Y", "Z"]
)

方案B:修复已读入的错误DataFrame

如果已经按原方式读入、首列已经出现字段合并,直接拆分粘连的首列即可:

# 拆分第一列的粘连内容为4个独立字段
split_res = df.iloc[:, 0].str.split(r"\s+", expand=True)
df[["year", "doy", "time1", "time2"]] = split_res
# 删除原粘连的首列
df = df.drop(columns=df.columns[0])

步骤2:解析为datetime类型时间列

利用Pandas原生对年积日(day of year, doy)的解析支持,直接组装时间字符串后解析,不需要手动计算月份、日期,自动适配闰年、大小月规则:

# 组装为「年:年积日:第一组时分秒」格式的字符串,匹配对应解析规则
df["datetime"] = pd.to_datetime(
    df["year"].astype(str) + ":" + df["doy"].astype(str) + ":" + df["time1"],
    format="%Y:%j:%H:%M:%S"
)

生成的datetime列即为标准Pandas datetime64[ns]类型,可直接用于时间筛选、重采样、计算等操作。


可选:输出指定格式的时间字符串

如果需要生成2015-1-1 00:03:00样式(月、日无前导零)的字符串列,可通过strftime转换:

# Linux/macOS 系统用以下代码
df["datetime_fmt"] = df["datetime"].dt.strftime("%Y-%-m-%-d %H:%M:%S")

# Windows 系统用以下代码(去掉前导零的格式符为%#开头)
# df["datetime_fmt"] = df["datetime"].dt.strftime("%Y-%#m-%#d %H:%M:%S")

注意:转换为字符串后不再是datetime类型,若需要做时间相关计算,请保留原始datetime列。


内容的提问来源于stack exchange,提问作者Danial

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:18:23