首先 – 道歉但我无法使用代码重现此错误.我将尝试使用数据和错误的屏幕截图尽可能地描述它.
我有一个由’Year’和’Season’索引的大型数据框,其中包含纬度,经度和降雨量的值,其他一些看起来像这样:
这是为了尊重“冬天”,“春天”,“夏天”,“秋天”(季节专栏中的数字1:4)的年度顺序 – 我需要在转换为Xarray数据集之后保持这个序列.但如果我尝试直接转换为数据集:
future = future.to_xarray()
所以很明显我需要通过唯一标识符重新索引,我尝试使用lat和lon,但这会产生相同的错误(因为有重复).重置索引然后重新索引然后使用lat,lon和time
像这样:
future = future.reset_index()
future.head()
future.set_index(['latitude', 'longitude', 'time'], inplace=True)
future.head()
允许的
future = future.to_xarray()
代码工作:
问题是现在已经失去了它的年度排序,您可以从数据集中的季节变量看到它在一年的前3个月从’1”1”1’开始,但随后跳到’3′ ,’3′,’3’意味着我们要从冬天到夏天,跳过春天.
这只是在重新索引数据帧之后的情况,但我无法在没有重新索引的情况下将其转换为数据集,而且我似乎无法在不中断年度序列的情况下重新编制索引.有办法解决这个问题吗?
我希望这很清楚,并且错误的说明足以让某人能够提供帮助!
编辑:
我认为这里的问题是它按日期索引它会按时间顺序自动排序日期(例如1952年跟随1951年等),但我不想这样,我希望它保持初始数据框中的序列(按季节组织,但它可能有一个1955年的春天,然后是2000年的夏天,然后是1976年的秋天) – 我需要保留这个序列.
编辑2:
因此,当我将’Year’设置为索引时,数据集看起来像这样,或者只是保持索引通用但我需要tg变量来使lat / lon与之关联,因此数据集如下所示:
<xarray.Dataset>
Dimensions: (Year: 190080)
Coordinates:
* Year (Year) int64 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
Data variables:
Season (Year) object '1' '1' '2' '2' '2' '3' '3' '3' '4' '4' '4' '1' ...
latitude (Year) float64 51.12 51.12 51.12 51.12 51.12 51.12 51.12 ...
longitude (Year) float64 -10.88 -10.88 -10.88 -10.88 -10.88 -10.88 ...
seasdif (Year) float32 -0.79192877 -0.79192877 -0.55932236 ...
tg (Year, latitude, longitude) float32 nan nan nan nan nan nan nan nan nan nan nan ...
time (Year) datetime64[ns] 1970-01-31 1970-02-28 1970-03-31 ...
最佳答案 告诉我这是否适合你.我添加了一个额外的索引列,并使用它进行排序.
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相关的lat,lon,time(虽然我没有在df中使用它).
df2 = df
df2.sortby('Order')
您也可以删除“订单”列,但我不确定它是否会改变您的订单.(它不会改变我的订单)
df2.drop('Order')