遍历字典 - FutureWarning:不推荐使用不存在的键对非单调 DatetimeIndexes 进行基于值的部分切片

Dan*_*ana 1 python dictionary loops pandas

在 R 中使用了很长时间后,我正在转换回 Python,我不记得存储多个参与者的时间序列的最佳方法。一些搜索建议的字典很好,但是当我遍历字典时,我收到了几次以下警告: indexing.py:1069: FutureWarning: Value based partial slicing on non-monotonic DatetimeIndexes with non-existing keys is deprecated and will raise a KeyError in a future Version. return self._getitem_tuple_same_dim(tup)

我应该以不同的方式做什么?非常感谢!

df_motion =

约会时间 X z
2020-07-10 13:49:11.429 0.213234 -0.069581 -10.066122
2020-07-10 13:49:11.440 0.219219 -0.047585 -10.085126
2020-07-10 13:49:11.450 0.319219 -0.057585 -10.185357
df_motion_dict[1] = df_motion # and other pandas dataframes of motion signals where the keys are a list with missing numbers, for example 1,3,4,10. 
audience = {}
for k,v in df_motion_dict.items():
    df_motion = df_motion_dict[k]
    df_motion = df_motion.loc['2020-07-10 13:55' : '2020-07-10 14:25.5', :]
    if len(df_motion)>0: # remove any dataframes not containing data
        audience[k]=df_motion    
Run Code Online (Sandbox Code Playgroud)

Cha*_*row 8

我看到您已经解决了这个问题,但我想向后代澄清,此警告的根本原因是时间序列索引中的间距不一致,同时使用索引中不存在的键进行切片。主要补救措施有两种:

  1. 使用df_motion.resample()并重新采样到适当的频率(在本例中可能是 10 毫秒),提供某种聚合函数,然后根据需要填充空白,具体取决于频率和数据本身的变化。这将解决non-monotonic错误的“”方面,并允许您继续使用索引中不存在的键进行切片。
    df_motion = df_motion.resample(freq='10ms').mean()
  2. 使用索引中完全存在的键进行切片,例如df_motion.loc['2020-07-10 13:49:11.429':'2020-07-10 13:49:11.450']. loc这将与处理非时间序列数据帧时通常的工作方式相同,并且不会引发此错误。

顺便说一句,您还在 for 循环中创建了一个重复的变量。当您迭代字典的项目并将它们临时分配给 时k, vk将一一保存每个键,并将v保存每个关联的值。因此,在 for 循环内部,您可以使用v而不是创建df_motion变量:

audience = {}
for k,v in df_motion_dict.items():
    v = v.loc['2020-07-10 13:55' : '2020-07-10 14:25.5', :]
    if len(v)>0: # remove any dataframes not containing data
        audience[k]=v
Run Code Online (Sandbox Code Playgroud)

或者更简洁地说:

audience = {
    k: v.loc['2020-07-10 13:55':'2020-07-10 14:25.5']
    for k, v in df_motion_dict.items()
    if not v.empty
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*iso 5

我在这里遇到了同样的问题。我搜索了 Pandas 文档,但找不到替代方法或任何关于它为什么会被弃用的解释。无论如何,我可以通过在查询前对索引进行排序来消除警告。

尝试这个:

df_motion = df_motion.sort_index().loc['2020-07-10 13:55' : '2020-07-10 14:25.5', :] 
Run Code Online (Sandbox Code Playgroud)

我希望这也适用于你。

  • 谢谢罗伯托!这也为我消除了错误。干杯! (3认同)