作為一名糖尿病患者,我正在分析我的連續血糖監測儀的讀數。我有一個電子表格,其中記錄了日期/時間、條目型別和我的血糖水平。每行代表一個新條目,條目可以是各種型別,例如:
- DOSE_INSULIN(注射的胰島素單位量),
- NEW_SENSOR(記錄我更換了 CGM 傳感器),或
- TEXT(我想記錄下來的任何基于文本的資訊)。
我想要做的是創建一個新列來跟蹤傳感器交換之間經過的時間(以小時為單位),以便我最終可以確定傳感器年齡和 BGL 控制/可變性之間是否存在關系。
這是預先的示例表:
| 日期 | 型別 |
|---|---|
| 11/21/21 12:55AM | 文本 |
| 11/21/21 1:16AM | 劑量_胰島素 |
| 11/21/21 2:05AM | NEW_SENSOR |
| 11/21/21 2:12AM | 劑量_胰島素 |
| 11/21/21 2:34AM | 劑量_胰島素 |
| 11/21/21 2:44AM | NEW_SENSOR |
這是我希望它之后的樣子:
| 日期 | 型別 | hours_since_new_sensor |
|---|---|---|
| 11/21/21 12:55AM | 文本 | NaN |
| 11/21/21 1:16AM | 劑量_胰島素 | NaN |
| 11/21/21 2:05AM | NEW_SENSOR | 0 |
| 11/21/21 2:12AM | 劑量_胰島素 | 0.12 |
| 11/21/21 2:34AM | 劑量_胰島素 | 0.48 |
| 11/21/21 2:44AM | NEW_SENSOR | 0 |
我發現還有一些其他的 stackoverflow 頁面也有類似的問題,但我無法將它們調整到我的特定問題。
- 這將創建基于兩個獨立組的新列。
- 這個使用石斑魚,但也按 ID 分組,這讓我很困惑。
到目前為止,我只能到達這一行:
df['date'].where(df['type'] == 'NEW_SENSOR')
據我所知,它將輸出一系列(?)空值,除了型別為 NEW_SENSOR 的地方,在這種情況下,它將輸出該事件的日期。我不知道如何擴展這個以獲得我真正想要的東西。
任何幫助或建議將不勝感激,非常感謝!
uj5u.com熱心網友回復:
嘗試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
uj5u.com熱心網友回復:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/384375.html
