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
相关产品推荐
相关产品推荐

