如何计算自特定列中发生事件以来经过的时间 - Pandas DataFrames
Posted
技术标签:
【中文标题】如何计算自特定列中发生事件以来经过的时间 - Pandas DataFrames【英文标题】:How to calculate time elapsed since an event occurred in a specific column - Pandas DataFrames 【发布时间】:2022-01-20 15:13:42 【问题描述】:作为糖尿病患者,我正在分析我的连续血糖监测仪的读数。我有一个电子表格,其中记录了日期/时间、条目类型和血糖水平。每行代表一个新条目,条目可以有多种类型,例如:
DOSE_INSULIN(注射胰岛素的单位数量), NEW_SENSOR(记录我更换了 CGM 传感器),或 TEXT(任何我想记录下来的基于文本的信息)。我要做的是创建一个新列来跟踪传感器交换之间经过的时间(以小时为单位),以便我最终可以确定传感器之间是否存在关系年龄和 BGL 控制/可变性。
这是一个预先的示例表:
date | type |
---|---|
11/21/21 12:55AM | TEXT |
11/21/21 1:16AM | DOSE_INSULIN |
11/21/21 2:05AM | NEW_SENSOR |
11/21/21 2:12AM | DOSE_INSULIN |
11/21/21 2:34AM | DOSE_INSULIN |
11/21/21 2:44AM | NEW_SENSOR |
这就是我希望它之后的样子:
date | type | hours_since_new_sensor |
---|---|---|
11/21/21 12:55AM | TEXT | NaN |
11/21/21 1:16AM | DOSE_INSULIN | NaN |
11/21/21 2:05AM | NEW_SENSOR | 0 |
11/21/21 2:12AM | DOSE_INSULIN | 0.12 |
11/21/21 2:34AM | DOSE_INSULIN | 0.48 |
11/21/21 2:44AM | NEW_SENSOR | 0 |
我发现其他一些 *** 页面也有类似的问题,但我无法根据我的具体问题调整它们。
This one 基于两个单独的组创建新列。 This one 使用 grouper,但也按 ID 分组,这让我很困惑。到目前为止,我只能到达这条线:
df['date'].where(df['type'] == 'NEW_SENSOR')
据我所知,它将输出一系列(?)空值,除了类型为 NEW_SENSOR 的情况,在这种情况下它将输出该事件的日期。我不知道如何扩展它以获得我真正想要的东西。
任何帮助或建议将不胜感激,非常感谢!
【问题讨论】:
我认为您需要为您的表编写一个迭代函数来生成新列的小时数。 【参考方案1】:试试groupby
:
df["date"] = pd.to_datetime(df["date"])
df["hours_since_new_sensor"] = df["date"] - df.groupby(df["type"].eq("NEW_SENSOR").cumsum())["date"].transform("min")
#reset the value before the first NEW_SENSOR to null
df["hours_since_new_sensor"] = df["hours_since_new_sensor"].where(df["type"].eq("NEW_SENSOR").cumsum()>0)
>>> df
date type hours_since_new_sensor
0 2021-11-21 00:55:00 TEXT NaT
1 2021-11-21 01:16:00 DOSE_INSULIN NaT
2 2021-11-21 02:05:00 NEW_SENSOR 0 days 00:00:00
3 2021-11-21 02:12:00 DOSE_INSULIN 0 days 00:07:00
4 2021-11-21 02:34:00 DOSE_INSULIN 0 days 00:29:00
5 2021-11-21 02:44:00 NEW_SENSOR 0 days 00:00:00
如果您想将时间更改为小时,您可以:
df["hours_since_new_sensor"] = df["hours_since_new_sensor"].dt.total_seconds().div(3600)
>>> df
date type hours_since_new_sensor
0 2021-11-21 00:55:00 TEXT NaN
1 2021-11-21 01:16:00 DOSE_INSULIN NaN
2 2021-11-21 02:05:00 NEW_SENSOR 0.000000
3 2021-11-21 02:12:00 DOSE_INSULIN 0.116667
4 2021-11-21 02:34:00 DOSE_INSULIN 0.483333
5 2021-11-21 02:44:00 NEW_SENSOR 0.000000
【讨论】:
谢谢你,这工作得很好。如果你不介意,你能用外行的语言解释你写的第二行发生了什么吗?我很难解析你是如何把这些放在一起的——请原谅我的无知。再次感谢您的帮助。df["type"].eq("NEW_SENSOR").cumsum())
将您的 DataFrame 分成组,每个组从包含“NEW_SENSOR”的行开始。对于每个组,您从“日期”中减去该组中的最小“日期”(即您获得新传感器的日期)。【参考方案2】:
df["date"] = pd.to_datetime(df["date"])
g = df['type'].eq('NEW_SENSOR').cumsum()
df['hours_since_new_sensor'] = df.groupby(g)['date'].diff().fillna(pd.Timedelta(0)).dt.total_seconds().div(60*60).groupby(g).cumsum().round(2)
输出:
>>> df
date type hours_since_new_sensor
0 2021-11-21 00:55:00 TEXT 0.00
1 2021-11-21 01:16:00 DOSE_INSULIN 0.35
2 2021-11-21 02:05:00 NEW_SENSOR 0.00
3 2021-11-21 02:12:00 DOSE_INSULIN 0.12
4 2021-11-21 02:34:00 DOSE_INSULIN 0.48
5 2021-11-21 02:44:00 NEW_SENSOR 0.00
【讨论】:
以上是关于如何计算自特定列中发生事件以来经过的时间 - Pandas DataFrames的主要内容,如果未能解决你的问题,请参考以下文章