![](/img/trans.png)
[英]How to measure the time elapsed since the beginning of an event, and record it in a new dataframe column?
[英]How to calculate time elapsed since an event occurred in a specific column - Pandas DataFrames
作为糖尿病患者,我正在分析我的连续血糖监测仪的读数。 我有一个电子表格,其中记录了日期/时间、条目类型和血糖水平。 每行代表一个新条目,条目可以是各种类型,例如:
我要做的是创建一个新列来跟踪传感器交换之间经过的时间量(以小时为单位) ,以便我最终可以确定传感器年龄和 BGL 控制/可变性之间是否存在关系。
这是预先的示例表:
日期 | 类型 |
---|---|
21 年 11 月 21 日上午 12:55 | 文本 |
21 年 11 月 21 日凌晨 1 点 16 分 | 剂量_胰岛素 |
21 年 11 月 21 日凌晨 2 点 05 分 | NEW_SENSOR |
21 年 11 月 21 日凌晨 2 点 12 分 | 剂量_胰岛素 |
21 年 11 月 21 日凌晨 2 点 34 分 | 剂量_胰岛素 |
21 年 11 月 21 日凌晨 2 点 44 分 | NEW_SENSOR |
这是我希望它之后的样子:
日期 | 类型 | hours_since_new_sensor |
---|---|---|
21 年 11 月 21 日上午 12:55 | 文本 | 钠 |
21 年 11 月 21 日凌晨 1 点 16 分 | 剂量_胰岛素 | 钠 |
21 年 11 月 21 日凌晨 2 点 05 分 | NEW_SENSOR | 0 |
21 年 11 月 21 日凌晨 2 点 12 分 | 剂量_胰岛素 | 0.12 |
21 年 11 月 21 日凌晨 2 点 34 分 | 剂量_胰岛素 | 0.48 |
21 年 11 月 21 日凌晨 2 点 44 分 | NEW_SENSOR | 0 |
我还发现了一些其他带有类似问题的 stackoverflow 页面,但我无法将它们调整为我的具体问题。
到目前为止,我只能到达这条线:
df['date'].where(df['type'] == 'NEW_SENSOR')
据我了解,output 将是一系列(?) null 值,除了类型为 NEW_SENSOR 的地方,在这种情况下它将 output 事件的日期。 我不知道如何扩展它以获得我真正想要的东西。
任何帮助或建议将不胜感激,非常感谢!
尝试使用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["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)
Output:
>>> 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.