我有一個像這樣的pandas資料框架
lat lon value
10 10 1
這個資料框有700萬個資料點
我想將其轉換為一個陣列,這樣最后我就可以將它們轉換為一個凈的cdf檔案。 我有兩種方法來做這件事
用gdal將資料幀轉換為點狀的shapefile,然后用qgis將shapefile轉換成光柵。
將pandas的資料框架轉換為陣列,并將陣列寫入一個.nc檔案。根據我的估計,在超級計算機的18核英特爾cpu上,這將需要120小時。(代碼使用joblib并行化。)
這段代碼看起來像這樣
lati=np.round(np.linspace(np.min(df. lat),np.max(df.lat),lat_range 1),2)
loni=np.round(np.linspace(np.min(df.lon),np. max(df.lon),lon_range 1) ,2)
target_column = 'soil_moisture''lat','lon']
df_temp = df.set_index(search_columns)
def func(i,j)。
緯度=lati[i]
經度=loni[j]
search_values = [latitude, longitude)
value = df_temp.loc[tuple(search_values), target_column]
return(value)
from joblib import Parallel, delayed
results= Parallel(n_jobs=-1, verbose=2)(delayed(func)(i, j) for i in range(lat_range 1) for j in range(lon_range 1))
m=np.reshape(results, (lat_range 1,lon_range 1)
我在一個假資料集上測驗了這段代碼,它運行良好,但在原始資料集上,它需要很多時間。
uj5u.com熱心網友回復:
沒有資料樣本,就很難猜測你可以使用什么樣的方法。我做了一個2種情況的樣本:
a) 你的資料是在一個小房間里的,你的資料是在一個大房間里的。
a) 你在表中的資料是有組織的,所以你可以使用NumPy的reshape
。b) 你的表格中的資料是沒有組織的,所以你可以使用插值到一些常規網格
。#!/usr/bin/env ipython。
import pandas as pd
import numpy as np
# -------------------------
# example with data at regular grid:
xx = np.linspace(0.,360,100);ddx = np.mean(np.diff(xx) )
yy = np.linspace(-180.0,180.0,100); ddy = np.mean(np.diff(yy))
xm,ym = np.Meshgrid(xx,yy);
zz = 50.0 10.0*np.random.random((np.size(yy),np.size(xx))。
data = {'lon':xm.flatten(), 'lat':ym.flatten(), 'data':zz.flatten()};
df = pd.DataFrame.from_dict(data)。
# let us convert this data back to understandable form:.
xo = np.unique(df['lon'].values);yo = np.unique(df['lat'].values); zo = df['data'].values;
zreg = np.reshape(zo,(np.size(yo),np.size(xo))。
print(zz == zreg);# 原始的和Pandas資料框架的是一樣的嗎?
# =========================================================================================================
# ---------------------------------
# example with data randomly ordered, irregular space?
xcoords = xm.flatten() ddx/2*np.random.random(np.size(zz.flatten() )) # original coords some small noise (half the cell)
ycoords = ym.flatten() ddy/2*np.random.random(np.size(zz.flatten() )) # original coords some small noise (half the cell)
points = np.concatenate((xcoords[:,np.newaxis],ycoords[:,np.newaxis],zz.flatten()[:,np.newaxis]), axis=1)
points = points[point[:, 2].argsort()] 。# let us sort points by values[/span
data = {'lon':point[:,0], 'lat': points[:,1],'data':point[:,2]};
# -----------------------------------------------------------------
df = pd.DataFrame.from_dict(data)。
xp = df['lon'].values;yp = df['lat'].values; zp = df['data'].values
from scipy.interpolate import griddata
zo = griddata((xp,yp),zp,(xm,ym),'nearest'); # I would make some interpolation to regular grid..._/span>
print(zz == zo)。
當然,如果你有700萬個點,那么你可能需要相當多的記憶體來保存資料。我能夠用2000x2000和3000x3000個點來測驗我的代碼,但只是在一臺有大量記憶體的機器上。另一方面,我的舊筆記本只能用1000x1000。在任何情況下,對于不規則的資料,內插值有時會與原始值不同,但在我看來,差異相對較小。
之后撰寫netCDF真的很容易:
from netCDF4 import Dataset
with Dataset('test.nc','w','NETCDF3') as ncout:
ncout.createDimension('lon',np.size(xx) )。
ncout.createDimension('lat',np.size(yy))。
xvar = ncout.createVariable('lon','float32', ('lon');xvar[:] = xx
yvar = ncout.createVariable('lat','float32',('lat');yvar[:] = yy
zvar = ncout.createVariable('data','float32',('lat','lon')); zvar[:] = zo
uj5u.com熱心網友回復:
如果df像你所描述的那樣,像df.set_index(['lat', 'lon']).to_xarray()可能會做。
這里有一些在我的電腦上作業的線條 :
import pandas as pd
df = pd.DataFrame(data=[[10, 10, 0。 1], [10, 15, 0。 2], [15, 10, 0。 3], [15, 15, 0.3]]。
columns=['lon', 'lat', 'soil_moisture'] )
df.set_index(['lat', 'lon']) .to_xarray()
結果是一個漂亮的xarray.Dataset。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/306914.html
標籤:
上一篇:用物件轉換陣列
