python Pandas在5分钟的间隔内选择最新的日期时间

mzaanser  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(200)

我尝试在5分钟间隔内为测量类型选择最新时间值。

data = [
        ["2017-01-03T10:04:45", "A", "35.79"],
        ["2017-01-03T10:01:18", "B", "98.78"],
        ["2017-01-03T10:09:07", "A", "35.01"],
        ["2017-01-03T10:03:34", "B", "96.49"],
        ["2017-01-03T10:02:01", "A", "35.82"],
        ["2017-01-03T10:05:00", "B", "97.17"],
        ["2017-01-03T10:05:01", "B", "95.08"]
       ]

df = pd.DataFrame(data, columns=["timestamp", "measurement_type", "measurement_value"])
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['measurement_value'] = df['measurement_value'].astype(float)

我的数据框df:
| 时间戳|测量类型|测量值|
| - ------|- ------|- ------|
| 2017年1月3日10:04:45|A类|三十五点七九|
| 2017年1月3日10:01:18|乙|九十八点七八分|
| 2017年1月3日10:09:07|A类|三十五点零一分|
| 2017年1月3日10:03:34|乙|九十六点四九分|
| 2017年1月3日10:02:01|A类|三十五点八二分|
| 2017年1月3日10:05:00|乙|九十七点一七分|
| 2017年1月3日10:05:01|乙|九十五点零八分|
期望输出IST:
| 时间戳|测量类型|测量值|
| - ------|- ------|- ------|
| 2017年1月3日10:05:00|A类|三十五点七九|
| 2017年1月3日10时10分|A类|三十五点零一分|
| 2017年1月3日10:05:00|乙|九十七点一七分|
| 2017年1月3日10时10分|乙|九十五点零八分|
因此,应将时间戳舍入到时间戳所在的5分钟内。如果时间戳等于时间间隔边界,则应考虑当前时间间隔,例如:|2017年1月3日10:05:00|乙|九十七点一七分|属于10:05:00而不是10:10:00
我发现了这个

df.groupby(["measurement_type", pd.Grouper(key="timestamp", freq="5min", offset="1sec")])["timestamp"].max()

其输出:

measurement_type  timestamp          
SPO2              2017-01-03 10:00:01   2017-01-03 10:05:00
                  2017-01-03 10:05:01   2017-01-03 10:05:01
TEMP              2017-01-03 10:00:01   2017-01-03 10:04:45
                  2017-01-03 10:05:01   2017-01-03 10:09:07
Name: timestamp, dtype: datetime64[ns]

但我对此有以下问题:
1.日期时间是四舍五入,但我需要它四舍五入(我解决了这个问题,只是增加了5分钟,每个日期时间,但也许有一个更好的选择?)
1.我使用了offset ="1sec",所以10:05:00被认为是10:00:00间隔,而不是10:05:00(请记住这是正确的,因为时间戳正在四舍五入,但我实际上需要它们四舍五入)。我想我将再次从时间戳中减去一秒,以去除01。
1.输出是一个丢失了measurement_value的Series。是否可以保留measurement_value列以及所选时间戳的相应值?我的意思是,就像在所需输出中获得一个DataFrame一样
我希望我的问题是可以理解的

jyztefdp

jyztefdp1#

使用参数closed='right'label='right'创建5min频率分组器,然后将 Dataframe 排序为timestamp,然后排序为groupby,并使用last进行聚合,以选择5分钟间隔内时间戳最新的行

g = pd.Grouper(key='timestamp', freq='5min', label='right', closed='right')
df.sort_values('timestamp').groupby(['measurement_type', g]).last().reset_index()

结果

measurement_type           timestamp  measurement_value
0                A 2017-01-03 10:05:00              35.79
1                A 2017-01-03 10:10:00              35.01
2                B 2017-01-03 10:05:00              97.17
3                B 2017-01-03 10:10:00              95.08

相关问题