我尝试在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一样
我希望我的问题是可以理解的
1条答案
按热度按时间jyztefdp1#
使用参数
closed='right'
和label='right'
创建5min
频率分组器,然后将 Dataframe 排序为timestamp
,然后排序为groupby
,并使用last
进行聚合,以选择5分钟间隔内时间戳最新的行结果