如何防止 python 中的 netcdf4 在使用 datetime 时加载整个变量
how to prevent netcdf4 in python from loading entire variable when using datetime
我希望验证我对 python 对象在此示例中的行为方式的理解。
假设我在一台内存有限的笔记本电脑上有一个非常大的 netcdf4 数据集,例如无限维度中的一百万个点 "time" 自 2015 年 11 月 12 日以来以秒为单位 [=31= .000000 0:00。我想作为日期时间对象访问第一次和最后一次 而无需 加载内存中的所有值。
现在我知道我可以使用以下代码获取第一个和最后一个日期作为日期时间对象:
import netCDF4 as nc4
from netCDF4 import Dataset
cdf = Dataset(fname,mode="r",format='NETCDF4')
time_var = cdf.variables['time']
dtime = nc4.num2date(time_var[0:10],time_var.units)
print('data starts at %s' % dtime[0])
打印语句给了我想要的:
"data starts at 2015-11-12 16:00:08"
现在 python 是否将所有 'time' 数据加载到内存中来执行此操作?或者,正如我使用 MATLAB 了解到的那样,cdf 现在是指向打开文件中 'time' 变量的指针。
非常感谢,
玛丽娜
是的,cdf 是打开文件的指针或视图,而不是内存中的副本。这个答案讨论了这个。
正如@bart 提到的,您应该只使用:
dtime = nc4.num2date(time_var[0],time_var.units)
和
dtime2 = nc4.num2date(time_var[-1],time_var.units)
得到你想要的时间。没有大的拷贝到内存中。
我希望验证我对 python 对象在此示例中的行为方式的理解。
假设我在一台内存有限的笔记本电脑上有一个非常大的 netcdf4 数据集,例如无限维度中的一百万个点 "time" 自 2015 年 11 月 12 日以来以秒为单位 [=31= .000000 0:00。我想作为日期时间对象访问第一次和最后一次 而无需 加载内存中的所有值。
现在我知道我可以使用以下代码获取第一个和最后一个日期作为日期时间对象:
import netCDF4 as nc4
from netCDF4 import Dataset
cdf = Dataset(fname,mode="r",format='NETCDF4')
time_var = cdf.variables['time']
dtime = nc4.num2date(time_var[0:10],time_var.units)
print('data starts at %s' % dtime[0])
打印语句给了我想要的:
"data starts at 2015-11-12 16:00:08"
现在 python 是否将所有 'time' 数据加载到内存中来执行此操作?或者,正如我使用 MATLAB 了解到的那样,cdf 现在是指向打开文件中 'time' 变量的指针。
非常感谢, 玛丽娜
是的,cdf 是打开文件的指针或视图,而不是内存中的副本。这个答案讨论了这个。 正如@bart 提到的,您应该只使用:
dtime = nc4.num2date(time_var[0],time_var.units)
和
dtime2 = nc4.num2date(time_var[-1],time_var.units)
得到你想要的时间。没有大的拷贝到内存中。