Python堆栈丢失数据

Python堆栈丢失数据,python,pandas,ascii,Python,Pandas,Ascii,我正在尝试重新组织数据(首要目标是将ASCII文件转换为netCDF)。其中一个步骤是获取数据并堆叠列。我的原始数据如下所示: import pandas as pd import numpy as np import xarray as xr fname = 'data.out' df = pd.read_csv(fname, header=0, delim_whitespace=True) print(df) 给予 然后我选择实际的时间步 months=list(df.columns)

我正在尝试重新组织数据(首要目标是将ASCII文件转换为netCDF)。其中一个步骤是获取数据并堆叠列。我的原始数据如下所示:

import pandas as pd
import numpy as np
import xarray as xr

fname = 'data.out'
df = pd.read_csv(fname, header=0, delim_whitespace=True)

print(df)
给予

然后我选择实际的时间步

months=list(df.columns)
months=months[3:]
并选择包含月度数据的所有列。然后返回形状

print(df[months].shape)
(708000,12)。到目前为止还不错,但是当我堆叠数据时

df_stack = df[months].stack()
print(df_stack.shape)
我得到的不是预期的形状((8496000,)而是(8493000,)。奇怪的是,脚本运行在其他文件上,这些文件的形状与我在本例中使用的数据相同,我没有这个问题。看起来我在250年内丢失了一个Lon/Lat像素-但我不明白为什么?当我尝试将数据转换为netcdf文件时,这会成为一个问题

lons = np.unique(df.Lon)
lats = np.unique(df.Lat)
years = np.unique(df.Year)

nyears = len(years)
nrows = len(lats)
ncols = len(lons)
nmonths = 12

lons.sort()
lats.sort()
years.sort()

time = pd.date_range(start=f'01/{years[0]}',
                     end=f'01/{years[-1]+1}', freq='M')

dx = 0.5
Lon = xr.DataArray(np.arange(-180.+dx/2., 180., dx), dims=("Lon"),
                   attrs={"long_name":"longitude", "unit":"degrees_east"})
nlon = Lon.size
dy = 0.5
Lat = xr.DataArray(np.arange(-90.+dy/2., 90., dy), dims=("Lat"),
                   attrs={"long_name":"latitude", "unit":"degrees_north"})
nlat = Lat.size

out = xr.DataArray(np.zeros((nyears*nmonths,nlat, nlon)),
                   dims=("Time","Lat","Lon"),
                   coords=({"Lat":Lat, "Lon":Lon, "Time":time}))

for nr in range(0,len(df.index),nyears):
    rows = df[nr:nr+nyears]
    thislon = rows["Lon"].min()
    thislat = rows["Lat"].min()
    out.loc[dict(
            Lon=thislon,
            Lat=thislat)] = df_stack[nr*nmonths:(nr+nyears)*nmonths]
  • 这给了我一个错误
它丢失了我在堆叠数据时丢失的3000个值。有人知道如何修复此问题吗?

替换:

df_stack = df[months].stack()


是否有任何
na
的地方?
stack()
默认情况下会删除NAs。
ValueError: could not broadcast input array from shape (0,) into shape (3000,)
df_stack = df[months].stack()
df_stack = df[months].stack(dropna=False)