Конвертировать файлы netCDF в csv - PullRequest
0 голосов
/ 16 апреля 2020

Я изо всех сил пытаюсь конвертировать несколько файлов NetCDF Berekeley Earth в CSV или другой табличный формат. Я понимаю, что подобные вопросы уже задавались ранее, но я не смог применить ни одно из найденных мной решений.

Например, этот набор данных .

  • ncdump из утилит netCDF, похоже, не генерирует фактический файл CSV. Я не смог найти инструкции, как это сделать.
  • Я пытался загрузить данные в pandas фрейм данных с xarray.to_dataframe(), но мой ноутбук не может выделить необходимую память.
In [1]: import xarray as xr

In [2]: import pandas as pd

In [3]: nc = xr.open_dataset('Complete_TAVG_Daily_EqualArea.nc')

In [4]: nc
Out[4]:
<xarray.Dataset>
Dimensions:      (map_points: 5498, time: 50769)
Dimensions without coordinates: map_points, time
Data variables:
    longitude    (map_points) float32 ...
    latitude     (map_points) float32 ...
    date_number  (time) float64 ...
    year         (time) float64 ...
    month        (time) float64 ...
    day          (time) float64 ...
    day_of_year  (time) float64 ...
    land_mask    (map_points) float64 ...

In [5]: df = nc.to_dataframe()
---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
(...)

MemoryError: Unable to allocate 532. MiB for an array with shape (279127962,) and data type int16
  • Я пытался конвертировать с Panoply. CSV-экспорт работает только для экспорта одной переменной (которую я хотел бы видеть в виде столбца) в однострочный файл.

Я должен что-то упустить. Кто-нибудь может мне помочь?

1 Ответ

2 голосов
/ 17 апреля 2020

Что вам не хватает, так это то, что netCDF является гораздо более сложным форматом, чем CVS. Файл netCDF может содержать несколько массивов любой формы и размера. Файл CSV может содержать только один массив максимум из двух измерений (или набор одномерных массивов, если все они имеют одинаковую длину). Поэтому вы не можете просто конвертировать любой файл netCDF в CSV.

Давайте посмотрим на файл примера, который вы дали. Я повторяю информацию здесь с моей версией Xarray, которая кажется немного более многословной ...

In [16]: ds = xr.open_dataset('Complete_TAVG_EqualArea.nc')

In [17]: ds
Out[17]:
<xarray.Dataset>
Dimensions:      (map_points: 5498, month_number: 12, time: 3240)
Coordinates:
    longitude    (map_points) float32 ...
    latitude     (map_points) float32 ...
  * time         (time) float64 1.75e+03 1.75e+03 1.75e+03 ... 2.02e+03 2.02e+03
Dimensions without coordinates: map_points, month_number
Data variables:
    land_mask    (map_points) float64 ...
    temperature  (time, map_points) float32 ...
    climatology  (month_number, map_points) float32 ...
Attributes:
    Conventions:          Berkeley Earth Internal Convention (based on CF-1.5)
    title:                Native Format Berkeley Earth Surface Temperature An...
    history:              16-Jan-2020 06:51:38
    institution:          Berkeley Earth Surface Temperature Project
    source_file:          Complete_TAVG.50985s.20200116T064041.mat
    source_history:       13-Jan-2020 17:22:52
    source_data_version:  ca6f26341938dae0ea7dd619bce6f15e
    comment:              This file contains Berkeley Earth surface temperatu...

Есть три переменных данных (land_mask, температура, климатология), плюс три вектора координат (долгота, широта, время). Возможно, вы можете включить векторы координат в качестве первой строки и столбца файла CSV, но даже тогда это означает, что вам нужно как минимум три отдельных файла CSV на файл netCDF.

Так, например, для фрейма данных climatology вы можете записать в CVS следующее:

In [31]: clim = ds['climatology']  

In [32]: clim.to_pandas().to_csv('clim.csv') 

Итак, clim - это xarray.DataFrame, который, в принципе, можно записать в файл CSV. К сожалению, класс xarray.DataFrame не имеет метода to_csv. Однако класс pandas.DataFrame делает, поэтому мы сначала преобразуем его во фрейм данных pandas. Посмотрите документацию по параметрам здесь , чтобы настроить сгенерированный выходной файл.

...