如何计算自特定列中发生事件以来经过的时间 - 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应js中发生事件(按钮单击)时将组件替换为另一个组件

如何在 jQuery 中发生事件后做某事?

熊猫:自某个日期以来经过的天数

Python - 如何计算自 X 日期以来经过的时间?

获取自上次增加 Prometheus 计数器以来经过的时间

如何在功能性 Vuejs 组件中发出事件