Pandas 如何仅选择数据帧时间窗口中的最新值?
我有一个数据帧,它应该被分成15分钟的时间窗口,也许可以通过使用一个新的列来标记它们,每个窗口都有一个唯一的标识符。然后我只想保留每个时间窗口的最新测量值。因此,如果在一个时间窗口内有两个“b”的测量值,则只保留最新的测量值,而删除较早的测量值 那么,假设我们有以下数据:Pandas 如何仅选择数据帧时间窗口中的最新值?,pandas,dataframe,Pandas,Dataframe,我有一个数据帧,它应该被分成15分钟的时间窗口,也许可以通过使用一个新的列来标记它们,每个窗口都有一个唯一的标识符。然后我只想保留每个时间窗口的最新测量值。因此,如果在一个时间窗口内有两个“b”的测量值,则只保留最新的测量值,而删除较早的测量值 那么,假设我们有以下数据: |**datetime** |**measurement**|**value**| |----------------|---------------|---------| |2018-07-18T0642Z|"a"
|**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 |
作为数据帧,它是这样的:
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 |
熊猫是如何做到这一点的?我认为需要:
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
打印(df)
日期时间测量值
0 2018-07-18T0642Z a 5347
2018-07-18T0641Z b 8345
2 2018-07-18T0640Z c 1256
3 2018-07-18T0630Z b 7485
4 2018-07-18T0629Z b 2536 Ah super,非常感谢您的指导!