【问题标题】:Pandas sort_index only the given timeframePandas sort_index 仅在给定的时间范围内
【发布时间】:2021-05-16 04:01:57
【问题描述】:

我有一个由 datetime_index 和一些值组成的 pandas 系列对象,如下所示:

df
2020-01-01 00:00:00    39.6
2020-01-01 00:15:00    35.6
2020-01-01 00:30:00    35.6
2020-01-01 00:45:00    39.2
2020-01-01 01:00:00    56.7
...
2020-12-31 23:45:00    56.3

我正在用.append() 向这个df 添加一些值。因为它没有排序,所以我通过.sort_index() 对其索引进行排序。然而,我想要实现的是我只想对给定的一天进行排序。

例如,我向2020-01-01 添加了一些值,并且由于添加的值将在2020-01-01 的一天结束之后,我只需要对一年中的第一天进行排序。 不是所有的 DF。

这里是一个例子,NaN 值加上.append():

df
2020-01-01 00:00:00    39.6
2020-01-01 00:15:00    35.6
...
2020-01-01 23:45:00    34.3
2020-01-01 15:00:00    NaN
...
2020-12-31 23:45:00    56.3

现在我不能df.sort_index(),因为它打破了其他日子。这就是为什么我只想将.sort_index() 应用到2020-01-01 的那天。我该怎么做?

到目前为止我尝试过但不起作用:

df.loc['2020-01-01'] = df.loc['2020-01-01'].sort_index()

【问题讨论】:

    标签: python pandas sorting indexing


    【解决方案1】:

    过滤2020-01-01天的行,排序并返回不匹配的行:

    mask = df.index.normalize() == '2020-01-01'
    
    df = pd.concat([df[mask].sort_index(), df[~mask]])
    print (df)
    2020-01-01 00:00:00    39.6
    2020-01-01 00:15:00    35.6
    2020-01-01 15:00:00     NaN
    2020-01-01 23:45:00    34.3
    2020-12-31 23:45:00    56.3
    Name: a, dtype: float64
    

    另一个想法:

    df1 = df['2020-01-01'].sort_index()
    df = pd.concat([df1, df.drop(df1.index)])
    

    【讨论】:

    • 第一个有效,我也可以尝试第二个。请问~mask之前是做什么的? @jezrael 谢谢!!!
    • @oakca - 将[False, True, True] 更改为[True, False, False],就像mask == False 一样工作
    • 两者都有效。所以~ 就像一个逆变器,但我不确定[False, True, True] 代表什么。无论如何
    • @oakca - 我想解释一下像工作反转掩码;)
    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 2020-12-20
    • 2021-10-13
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    相关资源
    最近更新 更多