如何将CSV中多列时间字段转换为标准Datetime列?
问题
我需要把CSV文件中的时间列(Year、Julian day、Hour/minut(UTC)、Second)合并成单个Datetime列,格式要求为「14/11/2017 00:16:00」。目前用pandas读取数据,但Hour/minut (UTC)列存在格式问题:0-9点的小时数只有一位(比如0点16分表示为016,9点直接显示为9而非09),请问怎么生成正确的Datetime数组?
附当前代码:
cols = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] D14 = pd.read_csv(r'C:\Users\William Jacondino\Desktop\DadosTimeSeries\PIRATA-PROFILE\Dados FLUXO\Dados_brutos_copy-20220804T151840Z-002\Dados_brutos_copy\tm_data_2017_11_14_0016.dat', header=None, usecols=cols, names=["Year","Julian day", "Hour/minut (UTC)", "Second", "Bateria (V)", "PTemp (°C)", "Latitude", "Longitude", "Magnectic_Variation (arb)", "Altitude (m)", "Course (º)", "WS", "Nmbr_of_Satellites (arb)", "RAD", "Tar", "UR", "slp",], sep=',') D14 = D14.loc[:, ["Year","Julian day", "Hour/minut (UTC)", "Second", "Latitude", "Longitude","WS", "RAD", "Tar", "UR", "slp"]]
解决方案
可通过以下步骤处理格式问题并生成标准Datetime列:
统一
Hour/minut (UTC)列格式
将该列转为字符串后,用str.zfill(4)补前导零,确保所有值为4位:比如"9"变成"0009","016"变成"0016",方便拆分小时和分钟。拆分小时与分钟
从补零后的字符串中提取前两位作为小时,后两位作为分钟。合并时间组件并转换为Datetime
结合Year、Julian day、提取出的小时/分钟、Second,转换为pandas的datetime对象,再格式化为指定字符串格式。
完整代码示例:
import pandas as pd # 读取数据(保留原有读取逻辑) cols = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] D14 = pd.read_csv(r'C:\Users\William Jacondino\Desktop\DadosTimeSeries\PIRATA-PROFILE\Dados FLUXO\Dados_brutos_copy-20220804T151840Z-002\Dados_brutos_copy\tm_data_2017_11_14_0016.dat', header=None, usecols=cols, names=["Year","Julian day", "Hour/minut (UTC)", "Second", "Bateria (V)", "PTemp (°C)", "Latitude", "Longitude", "Magnectic_Variation (arb)", "Altitude (m)", "Course (º)", "WS", "Nmbr_of_Satellites (arb)", "RAD", "Tar", "UR", "slp",], sep=',') D14 = D14.loc[:, ["Year","Julian day", "Hour/minut (UTC)", "Second", "Latitude", "Longitude","WS", "RAD", "Tar", "UR", "slp"]] # 处理Hour/minut (UTC)列 D14['time_str'] = D14['Hour/minut (UTC)'].astype(str).str.zfill(4) D14['Hour'] = D14['time_str'].str[:2].astype(int) D14['Minute'] = D14['time_str'].str[2:].astype(int) # 合并为datetime对象 D14['Datetime'] = pd.to_datetime( D14['Year'].astype(str) + ' ' + D14['Julian day'].astype(str).str.zfill(3) + ' ' + D14['Hour'].astype(str).str.zfill(2) + ' ' + D14['Minute'].astype(str).str.zfill(2) + ' ' + D14['Second'].astype(str).str.zfill(2), format='%Y %j %H %M %S' ) # 转换为指定显示格式(若需要字符串类型列可执行此步) D14['Datetime_str'] = D14['Datetime'].dt.strftime('%d/%m/%Y %H:%M:%S') # 删除中间辅助列 D14 = D14.drop(['time_str', 'Hour', 'Minute'], axis=1) # 查看结果 print(D14[['Datetime', 'Datetime_str']].head())
代码说明
str.zfill(4):强制补全为4位字符串,解决小时数位数不足的问题;pd.to_datetime配合%Y %j %H %M %S格式,直接将儒略日转换为标准日期;dt.strftime('%d/%m/%Y %H:%M:%S'):将datetime对象转为要求的字符串格式。
内容的提问来源于stack exchange,提问作者William Jacondino
相关产品推荐
相关产品推荐

