繁体   English   中英

如何计算自特定列中发生事件以来经过的时间 - Pandas DataFrames

[英]How to calculate time elapsed since an event occurred in a specific column - Pandas DataFrames

作为糖尿病患者,我正在分析我的连续血糖监测仪的读数。 我有一个电子表格,其中记录了日期/时间、条目类型和血糖水平。 每行代表一个新条目,条目可以是各种类型,例如:

  • DOSE_INSULIN(注射胰岛素的单位数量),
  • NEW_SENSOR(记录我更换了 CGM 传感器),或
  • TEXT(我想给自己记下的任何基于文本的信息)。

我要做的是创建一个新列来跟踪传感器交换之间经过的时间量(以小时为单位) ,以便我最终可以确定传感器年龄和 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 页面,但我无法将它们调整为我的具体问题。

  • 这一个基于两个单独的组创建新列。
  • 这个使用石斑鱼,但也按 ID 分组,这让我很困惑。

到目前为止,我只能到达这条线:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM