首先-道歉,但我无法使用代码重现此错误。我将尝试使用数据和错误的屏幕截图尽可能地描述它。
我有一个由“年”和“季节”索引的大型数据框,其中包含纬度,经度和降雨的值,其中一些看起来像这样:
这是为了尊重“冬季”,“春季”,“夏季”,“秋季”(“季节”列中的数字1:4)的年度顺序而组织的-在转换为Xarray后,我需要保留此顺序{ {1}}。但是,如果我尝试直接转换为Dataset
:
Dataset
因此很明显,我需要通过唯一的标识符重新索引,我尝试仅使用lat和lon,但这给出了相同的错误(因为存在重复项)。重置索引,然后重新索引,然后使用纬度,经度和时间 像这样:
future = future.to_xarray()
future = future.reset_index()
future.head()
允许
future.set_index(['latitude', 'longitude', 'time'], inplace=True)
future.head()
工作代码:
问题在于它现在已经失去了年度排序,您可以从数据集中的Season变量中看到,它在一年的前3个月开始于future = future.to_xarray()
,但随后跳至{{1} }意味着我们要从冬天到夏天,跳过春天。
只有在重新索引数据框后才会出现这种情况,但是如果不重新索引就无法将其转换为数据集,而且在不中断年度序列的情况下似乎无法重新索引。有什么办法可以解决这个问题?
我希望这是清楚的,并且该错误足以说明问题,以便有人能够提供帮助!
编辑: 我认为这里的问题是按日期索引时,它会自动按时间顺序对日期进行排序(例如1952年跟随1951年,依此类推),但是我不希望这样,我希望它在初始数据帧(按季节组织,但可能会有1955年的春天,然后是2000年的夏天,然后是1976年的秋天)-我需要保留此顺序。
编辑2:
因此,当我将'Year'设置为索引时,或者只是保持索引通用时,数据集看起来是这样的,但是我需要tg变量与之关联纬度/经度,因此数据集看起来像这样:
'1' '1' '1'
答案 0 :(得分:1)
告诉我是否适合您。我添加了一个额外的索引列,并使用它最后进行排序。
import pandas as pd
import xarray as xr
import numpy as np
df = pd.DataFrame({'Year':[1951,1951,1951,1951],'Season':[1,1,1,3],'lat':
[51,51,51,51],'long':[10.8,10.8,10.6,10.6],'time':['1950-12-31','1951-01-31','1951-
02-28','1950-12-31']})
将索引设为单独的列“ Order”,然后将其与set_index一起使用。这是由于以下事实:我只能对索引或一维列进行排序,而我们只有三个坐标。
df.reset_index(level=0, inplace=True)
df = df.rename(columns={'index': 'Order'})
df['time'] = pd.to_datetime(df['time'])
df.set_index(['lat', 'long', 'time','Order'], inplace=True)
df.head()
df = df.to_xarray()
这应该保留顺序,并具有与tg相关的纬度,经度,时间(尽管我在df中没有)。
df2 = df
df2.sortby('Order')
您也可以删除“订单”列,尽管我不确定是否会更改您的订单。(它不会更改我的订单)
df2.drop('Order')