Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有效地将熊猫数据帧重新采样到3d NumPy阵列中?_Python_Pandas_Numpy_Python Xarray - Fatal编程技术网

Python 如何有效地将熊猫数据帧重新采样到3d NumPy阵列中?

Python 如何有效地将熊猫数据帧重新采样到3d NumPy阵列中?,python,pandas,numpy,python-xarray,Python,Pandas,Numpy,Python Xarray,我有一个带有DatetimeIndex和多列的大数据框架。现在我想要一个操作resample_3d,可以这样使用: index, array = df.resample_3d("1h", fill_value=0) 。。。并转换数据帧 index | A | B | C | D 10:00 | 1 | | 10:01 | 1 | | 12:00 | 1 | | 13:00 | 1 | | 转换为形状(3、2、4)的三维NumPy数组。第一个维度是时间(可以在单独返回的索引

我有一个带有
DatetimeIndex
和多列的大数据框架。现在我想要一个操作
resample_3d
,可以这样使用:

index, array = df.resample_3d("1h", fill_value=0)
。。。并转换数据帧

index | A | B | C | D
10:00 | 1 |   | 
10:01 | 1 |   | 
12:00 | 1 |   |
13:00 | 1 |   |
转换为形状(3、2、4)的三维NumPy数组。第一个维度是时间(可以在单独返回的
索引中查找),第二个维度是“重采样组”中的行索引,第三个维度是特征。第二个维度的大小等于单个重采样组中的最大行数。未使用的条目将被填充(例如,用零填充)

Pandas/另一个库中是否有这样或类似的功能,或者是否有一种方法可以在Pandas之上高效地实现类似的功能,而无需做太多工作

我知道我可以在
df.resample().apply(list)
的基础上构建一些东西,但这对于更大的数据帧来说太慢了

我已经用Numba开始了自己的实现,但很快就意识到这是一项相当艰巨的工作


(我刚刚发现了xarray,我想我把这个问题加上它的标签,因为它可能是比熊猫更好的基础。)

不清楚您的数据是什么样的,但是的,xarray可能就是您搜索的

一旦数据格式良好,您就可以执行以下操作:

da.resample(time="1h")
它将返回一个对象

通常,在重新采样时,新坐标栅格与以前的栅格不匹配

因此,从这里开始,您需要应用众多方法中的一种来告诉xarray如何填充这个新网格

例如,您可能希望使用原始数据作为结来插值:

da.resample(time="1h").interpolate("linear")
但也可以回填、填充、使用最接近的值等

如果不想填充新网格,请使用
.asfreq()
,新时间将设置为NaN。以后仍然可以使用插值

你的案子 在您的例子中,似乎正在进行下采样,因此新栅格坐标和原始栅格坐标之间存在精确匹配

因此,对您有效的方法是
.nearest()
.asfreq()
.interpolate()
(请注意,
.interpolate()
int
转换为
float

但是,由于要在精确的网格节点处进行下采样,因此实际要做的是选择数组的子集,因此可能需要使用该方法

实例 精确网格点结的下采样示例

创建数据:

>>> dims = ("time", "features")
>>> sizes = (6, 3)
>>> h_step = 0.5

>>> da = xr.DataArray(
        dims=dims,
        data=np.arange(np.prod(sizes)).reshape(*sizes),
        coords=dict(
            time=pd.date_range(
                "04/07/2020",
                periods=sizes[0],
                freq=pd.DateOffset(hours=h_step),
            ),
            features=list(string.ascii_uppercase[: sizes[1]]),
        ),
    )

>>> da
<xarray.DataArray (time: 6, features: 3)>
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17]])
Coordinates:
  * time      (time) datetime64[ns] 2020-04-07 ... 2020-04-07T02:30:00
  * features  (features) <U1 'A' 'B' 'C'

>>> da.time.values
array(['2020-04-07T00:00:00.000000000',
       '2020-04-07T00:30:00.000000000',
       '2020-04-07T01:00:00.000000000', 
       '2020-04-07T01:30:00.000000000',
       '2020-04-07T02:00:00.000000000',
       '2020-04-07T02:30:00.000000000'],
      dtype='datetime64[ns]')
通过选择进行下采样:

>>> dwn_step = 2

>>> new_time = pd.date_range(
        "04/07/2020",
        periods=sizes[0] // dwn_step,
        freq=pd.DateOffset(hours=h_step * dwn_step),
    )

>>> da.sel(time=new_time)
<xarray.DataArray (time: 3, features: 3)>
array([[ 0,  1,  2],
       [ 6,  7,  8],
       [12, 13, 14]])
Coordinates:
  * time      (time) datetime64[ns] 2020-04-07 ... 2020-04-07T02:00:00
  * features  (features) <U1 'A' 'B' 'C'

>>> da.sel(time=new_time).time.values
array(['2020-04-07T00:00:00.000000000',
       '2020-04-07T01:00:00.000000000',
       '2020-04-07T02:00:00.000000000'],
      dtype='datetime64[ns]')

它更简单,但您不能选择第一次选择的时间(根据您的情况,它可以是好的,也可以是坏的)。

是的,但这将返回一个
DataArrayResample
。我不清楚如何将其转换为3d阵列(除了apply,它太慢了)。其思想是将所有数据重新采样到存储桶中(上述示例中的第二维度),而不减少(例如平均值)。并非所有应用于
DataArrayResample
对象的方法都是减少方法。我添加了更深入的解释,希望能有所帮助。
>>> dwn_step = 2

>>> new_time = pd.date_range(
        "04/07/2020",
        periods=sizes[0] // dwn_step,
        freq=pd.DateOffset(hours=h_step * dwn_step),
    )

>>> da.sel(time=new_time)
<xarray.DataArray (time: 3, features: 3)>
array([[ 0,  1,  2],
       [ 6,  7,  8],
       [12, 13, 14]])
Coordinates:
  * time      (time) datetime64[ns] 2020-04-07 ... 2020-04-07T02:00:00
  * features  (features) <U1 'A' 'B' 'C'

>>> da.sel(time=new_time).time.values
array(['2020-04-07T00:00:00.000000000',
       '2020-04-07T01:00:00.000000000',
       '2020-04-07T02:00:00.000000000'],
      dtype='datetime64[ns]')
new_time = da.time[::dwn_coeff]