【问题标题】:Changes Between Rows with Datetime .shift(-1) Not Returning Correct RowDatetime .shift(-1) 的行之间的更改未返回正确的行
【发布时间】:2021-04-01 07:17:11
【问题描述】:

我有以下 Dataframe,索引为 datetime64[ns]。

                           Side
CollectionTimestamp (CST)      
2020-01-06 08:35:00        High
2020-01-06 09:25:00         Low *******
2020-01-06 09:30:00         Low
2020-01-06 09:35:00         Low
2020-01-06 09:40:00         Low
2020-01-06 09:45:00         Low
2020-01-06 09:50:00         Low
2020-01-06 09:55:00         Low
2020-01-06 10:00:00         Low
2020-01-06 10:05:00         Low
2020-01-06 10:10:00         Low
2020-01-06 10:15:00         Low
2020-01-06 10:20:00         Low
2020-01-06 10:25:00         Low
2020-01-06 10:30:00         Low
2020-01-06 10:35:00         Low
2020-01-06 10:40:00         Low
2020-01-06 10:45:00         Low
2020-01-06 10:50:00         Low
2020-01-06 10:55:00         Low
2020-01-06 11:00:00         Low
2020-01-08 08:35:00        High
2020-01-08 10:15:00         Low *******
2020-01-08 10:20:00         Low
2020-01-08 10:30:00         Low
2020-01-08 10:35:00         Low
2020-01-08 10:40:00         Low
2020-01-08 10:45:00         Low
2020-01-08 10:50:00         Low
2020-01-08 10:55:00         Low
2020-01-08 11:00:00         Low

我想要一个新的数据框,其中 df['Side'] 不等于前一行(我已经放置了****,将在新的数据框中)但分组日期作为数据框将具有没有变化的日子。

df.dtypes()
Side    object

我试过这段代码:

df = df.loc[(df['Side'] != df['Side'].shift(-1))]

它返回以下内容:

                           Side
CollectionTimestamp (CST)      
2020-01-06 08:35:00        High
2020-01-06 11:00:00         Low
2020-01-08 08:35:00        High
2020-01-08 11:00:00         Low

第一次更改的行不正确,它似乎抓住了最后一次更改?

为什么不能不返回:

                           Side
CollectionTimestamp (CST)     
2020-01-06 09:25:00         Low
2020-01-08 10:15:00         Low

.shift(-1) 不正确吗?

我试图做一个 df.groupby(df.index.date),但这也没有用,所以我想我在这里遗漏了一些东西。

我试过了,但还是不正确:

df['C'] = df['Side'].shift(-1)
df = df.loc[(df['Side'] != df['C'])

【问题讨论】:

  • 逻辑对我来说仍然有点不清楚,因为当您真的想分别考虑每个独特的日子时,看起来您正在尝试从整个 DataFrame 创建一个掩码。如果您有一天从高到低多次变化,或者在一天中的某个地方,会发生什么?
  • 我想分别考虑每一天,如果从高到低的变化发生在第一次发生,即使之后发生。
  • 啊,好吧,让我更新那个答案以反映这一点。因此,如果一天从 Low 开始,并且是 Low-Low-High-Low-Low,您会想要我加粗的值,即高点之后的第一个低点?
  • 好的,谢谢。

标签: python pandas dataframe datetime time-series


【解决方案1】:

因为您想在一天之内执行此操作,并且可能有几天没有差异,您可以使用 groupbyandapply` 您的子集逻辑。这不是cythonized,因此对于较大的DataFrame,它往往会变慢。有一些技巧可以让您利用 cython 中实现的 groupby 操作,但它确实混淆了逻辑。

res = (df.groupby(df.index.date, group_keys=False)
         .apply(lambda gp: gp[gp['Side'].ne(gp['Side'].shift().fillna(gp['Side']))]))

res
                          Side
CollectionTimestamp (CST)     
2020-01-06 09:25:00        Low
2020-01-08 10:15:00        Low

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多