如何将NetCDF中的cftime格式转换为Unix时间戳(毫秒级)?
高效将NetCDF时间数值转换为毫秒级Unix时间戳
先搞懂decode_cf后的数值含义
你看到的这些数值不是随机数,是从2002-01-01T00:00:00开始经过的天数(小数部分代表一天内的时间占比),比如129.5就是起始时间加129天12小时。xarray.decode_cf()只是解析了CF元数据,并没有自动把数值转成datetime对象,所以保留了原始的天数数值。
两种无循环的高效转换方法
方法1:纯数值计算(最快)
直接通过时间差的数值运算转换,完全不需要创建datetime/cftime对象,效率最高:
import numpy as np import xarray as xr # 假设你的数据集为ds,时间变量是ds['time'] time_data = ds['time'] # 提取起始时间字符串(从units属性中获取) start_str = time_data.attrs['units'].split('since ')[1] # 转成numpy datetime64,计算起始时间的毫秒级Unix时间戳 start_unix_ms = np.datetime64(start_str).astype(np.int64) // 10**6 # 把天数转成毫秒:1天 = 86400秒 = 86400000毫秒 days_to_ms = time_data.values * 86400000 # 最终的毫秒级Unix时间戳数组 unix_ms_array = start_unix_ms + days_to_ms.astype(np.int64)
方法2:利用xarray/cftime的内置批量转换
如果需要先得到datetime对象再转换,用num2date(支持向量输入,无需循环)或者xarray的to_datetimeindex():
from cftime import num2date import xarray as xr # 方法2.1:用cftime.num2date批量转cftime对象,再转时间戳 time_vals = ds['time'].values units = ds['time'].attrs['units'] calendar = ds['time'].attrs['calendar'] # 批量生成cftime对象数组(无循环) cftime_arr = num2date(time_vals, units=units, calendar=calendar) # 转成毫秒级Unix时间戳 unix_ms_array = np.array([dt.timestamp() * 1000 for dt in cftime_arr]).astype(np.int64) # 方法2.2:用xarray内置方法转datetime索引 dt_index = ds['time'].to_datetimeindex() unix_ms_array = (dt_index.astype(np.int64) // 10**6).astype(np.int64)
注意:纯数值计算的方法1速度远快于方法2,适合处理大规模时间数组。
内容的提问来源于stack exchange,提问作者hillsonghimire
相关产品推荐
相关产品推荐

