如何仅选择熊猫DataFrame的时间窗口中的最新值?

时间:2018-07-18 06:56:31

标签: pandas dataframe

我有一个DataFrame,应该将其拆分为15分钟的时间窗口,也许可以通过使用一个新列为每个窗口具有唯一标识符的新列进行标记。然后,我只想保留每个时间窗口的最新测量值。因此,如果在一个时间窗口内有两个“ b”的度量,则仅保留最新的度量,而删除较早的度量。

因此,假设我们具有以下数据:

|**datetime**    |**measurement**|**value**|
|----------------|---------------|---------|
|2018-07-18T0642Z|"a"            |5347     |
|2018-07-18T0641Z|"b"            |8345     |
|2018-07-18T0640Z|"c"            |1256     |
|2018-07-18T0630Z|"b"            |7485     |
|2018-07-18T0629Z|"a"            |2536     |
|2018-07-18T0629Z|"b"            |5943     |

作为DataFrame就是这样:

import pandas as pd
df = pd.DataFrame(
         [
             ["2018-07-18T0642Z", "a", 5347],
             ["2018-07-18T0641Z", "b", 8345],
             ["2018-07-18T0640Z", "c", 1256],
             ["2018-07-18T0630Z", "b", 7485],
             ["2018-07-18T0629Z", "a", 2536],
             ["2018-07-18T0629Z", "b", 5943],
         ],
         columns = [
             "datetime",
             "measurement",
             "value"
         ]
    )
df["datetime"] = pd.to_datetime(df["datetime"])
df.index       = df["datetime"]
del df["datetime"]

添加了用于标记时间窗口的列后,它变为:

|**datetime**    |**measurement**|**value**|**time_window**|
|----------------|---------------|---------|---------------|
|2018-07-18T0642Z|"a"            |5347     |2              |
|2018-07-18T0641Z|"b"            |8345     |2              |
|2018-07-18T0640Z|"c"            |1256     |2              |
|----------------|---------------|---------|---------------|
|2018-07-18T0630Z|"b"            |7485     |1              |
|2018-07-18T0629Z|"a"            |2536     |1              |
|2018-07-18T0629Z|"b"            |5943     |1              |

现在,仅保留每个窗口中的最新测量值,这意味着将删除时间窗口1的第一个“ b”测量值:

|**datetime**    |**measurement**|**value**|**time_window**|
|----------------|---------------|---------|---------------|
|2018-07-18T0642Z|"a"            |5347     |2              |
|2018-07-18T0641Z|"b"            |8345     |2              |
|2018-07-18T0640Z|"c"            |1256     |2              |
|----------------|---------------|---------|---------------|
|2018-07-18T0630Z|"b"            |7485     |1              |
|2018-07-18T0629Z|"a"            |2536     |1              |

这在熊猫中如何实现?

1 个答案:

答案 0 :(得分:1)

我认为需要:

print (df)
           datetime measurement  value
0  2018-07-18T0642Z           a   5347
1  2018-07-18T0641Z           b   8345
2  2018-07-18T0640Z           c   1256
3  2018-07-18T0630Z           b   7485
4  2018-07-18T0629Z           b   2536 <- changed a to b
5  2018-07-18T0629Z           b   5943


df['datetime'] = pd.to_datetime(df['datetime'])
#convert datetimes to 10Min precision
df['date'] = df['datetime'].dt.floor('10Min')
#remove duplicates per columns, keep only first dupe
df = df.drop_duplicates(['measurement','date'])
print (df)
             datetime measurement  value                date
0 2018-07-18 06:42:00           a   5347 2018-07-18 06:40:00
1 2018-07-18 06:41:00           b   8345 2018-07-18 06:40:00
2 2018-07-18 06:40:00           c   1256 2018-07-18 06:40:00
3 2018-07-18 06:30:00           b   7485 2018-07-18 06:30:00
4 2018-07-18 06:29:00           b   2536 2018-07-18 06:20:00

#remove helper column date
df = df.drop('date',axis=1)
print (df)
             datetime measurement  value
0 2018-07-18 06:42:00           a   5347
1 2018-07-18 06:41:00           b   8345
2 2018-07-18 06:40:00           c   1256
3 2018-07-18 06:30:00           b   7485
4 2018-07-18 06:29:00           b   2536