xarray DataArray调用to_netcdf导出netCDF时datetime转换错误如何解决
问题根因
你遇到的报错本质是time坐标虽然标注为datetime64[ns]类型,但实际存储的是格式不规范的字符串(报错中提到的1979-1-1 0为单月/单日未补零、后缀带小时位的非标准时间格式),xarray在序列化写入netCDF时无法将其自动转换为合法的Timestamp对象。
解决方案
方案1:转换为标准datetime64格式
你的数据是1979-2018年逐月数据,共480个时间步,直接批量重置为规范时间坐标即可,操作代码如下:
import pandas as pd # 方法1:自动解析原时间字符串 dO18Buton['time'] = pd.to_datetime(dO18Buton['time'], errors='coerce') # 方法2:直接生成匹配的逐月时间坐标(更稳妥,避免原时间字符串的异常问题) dO18Buton['time'] = pd.date_range(start='1979-01-01', end='2018-12-01', freq='MS')
转换完成后即可正常导出。如果之前手动给time坐标设置过不规范的units属性,需要先删除再转换:
if 'units' in dO18Buton.time.attrs: del dO18Buton.time.attrs['units']
方案2:使用CFTimeIndex实现(推荐,兼容性更强)
完全可以通过CFTimeIndex解决该问题,该方案更适合非标准日历场景,也能避免Python原生datetime的序列化限制,操作代码如下:
import xarray as xr # 生成符合CF规范的标准日历逐月时间索引 dO18Buton['time'] = xr.cftime_range( start='1979-01-01', end='2018-12-01', freq='MS', calendar='standard' # 可根据需求替换为360_day、noleap等其他日历类型 ) # 导出文件 dO18Buton.to_netcdf('dO18Buton.nc', engine='netcdf4')
xarray会自动为CFTimeIndex生成符合CF公约的时间元数据,netcdf4引擎原生支持该格式,不会触发时间转换错误。
内容的提问来源于stack exchange,提问作者kartikasenja
相关产品推荐
相关产品推荐

