使用熊猫,Python将netCDF中的时间变量更改为日期时间

问题描述

我有一个netCDF文件,时间从0000年1月1日开始,以天为单位。但是,它们是整数,请参见下文,一旦加载xarray便无法解码时间单位。

<xarray.DataArray 'days' (time: 87600)>
array([679352.,679353.,679354.,...,766949.,766950.,766951.])
Dimensions without coordinates: time
Attributes:
    units:      days_since_Jan11900
    long_name:  calendar_days

我想把它们变成与大熊猫约会的时间。到目前为止,我已经做到了

import pandas as pd
import xarray as xr

ds = xr.open_dataset(path + '09_future_predictions/Fire weather/temp/tmax_HadGEM2-CC.nc',decode_times = False)

tmax = ds.tmax.data
time = ds.days
time = pd.to_datetime(time.data)

但是,我最终以大熊猫读取了以毫秒为单位的整数,见下文:

DatetimeIndex(['1970-01-01 00:00:00.000679352','1970-01-01 00:00:00.000679353','1970-01-01 00:00:00.000679354','1970-01-01 00:00:00.000679360','1970-01-01 00:00:00.000679361',...
               '1970-01-01 00:00:00.000766942',dtype='datetime64[ns]',length=87600,freq=None)

我该怎么做才能将其更改为第一个变量为1860-01-01

解决方法

与netCDF并不完全相同,但可以提供帮助。

import pandas as pd
import matplotlib.dates as md

df_1 = pd.DataFrame({'c1': [679352.,679353.,679354.,766949.,766950.,766951.]})

df_1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries,0 to 5
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   c1      6 non-null      float64
dtypes: float64(1)
memory usage: 176.0 bytes

df_1.c1.apply(md.num2date)
0   1861-01-01 00:00:00+00:00
1   1861-01-02 00:00:00+00:00
2   1861-01-03 00:00:00+00:00
3   2100-11-01 00:00:00+00:00
4   2100-11-02 00:00:00+00:00
5   2100-11-03 00:00:00+00:00
Name: c1,dtype: datetime64[ns,UTC]

,

我自己做到了。请注意,我使用的是每年365天的日历,并且在第二行编码中将0000年1月1日更改为1860年1月1日。

ds = xr.open_dataset(path + 'temp/tmax_HadGEM2-CC.nc',decode_times = False)
ds['days'] = ds.days - 679352
ds.days.attrs['units'] = 'days since 1860-01-01'
ds['days'].attrs['calendar'] = 'noleap'
ds = xr.decode_cf(ds)
ds = ds.loc[dict(time = slice(66430,73000))]