[英]Selecting time-window in a dataframe
我有一個數據幀,df,看起來像這樣:
HeartRate_smooth
2018-01-01 00:07:00 58.000000
2018-01-01 00:13:00 59.333333
2018-01-01 00:14:00 57.333333
2018-01-01 00:20:00 59.333333
2018-01-01 00:21:00 59.333333
2018-01-01 00:22:00 57.333333
2018-01-01 00:34:00 59.666667
2018-01-01 00:36:00 58.666667
2018-01-01 00:37:00 57.666667
2018-01-01 00:38:00 55.000000
2018-01-01 00:39:00 58.333333
2018-01-01 01:03:00 57.666667
2018-01-01 01:08:00 59.666667
2018-01-01 01:09:00 56.333333
2018-01-01 01:10:00 54.666667
2018-01-01 01:32:00 59.666667
2018-01-01 01:33:00 57.000000
2018-01-01 01:34:00 54.333333
2018-01-01 01:56:00 56.000000
2018-01-01 01:57:00 58.000000
2018-01-01 01:58:00 59.000000
2018-01-01 02:03:00 59.666667
2018-01-01 02:07:00 58.666667
2018-01-01 03:00:00 59.666667
2018-01-01 03:09:00 59.333333
2018-01-01 03:10:00 58.333333
2018-01-01 03:31:00 58.666667
2018-01-01 10:46:00 59.666667
2018-01-01 12:40:00 58.333333
2018-01-01 14:42:00 59.000000
該數據幀是患者心率低於閾值時的時間點的集合。 我假設這些要點是患者休息或睡着時。 我試圖找到可以識別患者睡眠時間的地方。 我假設當數據存在超過一小時時患者處於睡眠狀態,並且每段時間間隔之間的間隔小於30分鍾。
在給定的數據框架中,我可以假設患者在00:07到02:07睡着了。 這是因為從00:07到02:07,每行之間的缺失數據不到30分鍾。 在02:07之后出現的行的時間差超過30分鍾,因此我假設患者已經醒來。
請注意,我將循環訪問多個患者數據,患者睡着的時間段會有所不同。 它可能並不總是從數據幀中的第一個條目開始。
我的問題是:
1.我如何識別患者睡眠的時間段並將當前數據幀拆分為2,其中一個dfs用於在患者睡着時存儲數據,另一個用於患者清醒時?
2.這不是必要的,但如果可能,我如何打印出患者睡着的時間和時間?
根據提供的樣本數據框輸出樣本數據:
Asleep_df:
HeartRate_smooth
2018-01-01 00:07:00 58.000000
2018-01-01 00:13:00 59.333333
2018-01-01 00:14:00 57.333333
2018-01-01 00:20:00 59.333333
2018-01-01 00:21:00 59.333333
2018-01-01 00:22:00 57.333333
2018-01-01 00:34:00 59.666667
2018-01-01 00:36:00 58.666667
2018-01-01 00:37:00 57.666667
2018-01-01 00:38:00 55.000000
2018-01-01 00:39:00 58.333333
2018-01-01 01:03:00 57.666667
2018-01-01 01:08:00 59.666667
2018-01-01 01:09:00 56.333333
2018-01-01 01:10:00 54.666667
2018-01-01 01:32:00 59.666667
2018-01-01 01:33:00 57.000000
2018-01-01 01:34:00 54.333333
2018-01-01 01:56:00 56.000000
2018-01-01 01:57:00 58.000000
2018-01-01 01:58:00 59.000000
2018-01-01 02:03:00 59.666667
2018-01-01 02:07:00 58.666667
Awake_df:
HeartRate_smooth
2018-01-01 03:00:00 59.666667
2018-01-01 03:09:00 59.333333
2018-01-01 03:10:00 58.333333
2018-01-01 03:31:00 58.666667
2018-01-01 10:46:00 59.666667
2018-01-01 12:40:00 58.333333
2018-01-01 14:42:00 59.000000
“患者在00:07到03:31睡着了3小時24分鍾”
我覺得處理時間不是索引更容易:
df.reset_index(inplace=True)
# df now has a timestamp column named 'index'
# difference with previous row larger than 30 mins
# cumsum for consecutive block:
df['block'] = df['index'].diff().dt.seconds.ge(30*60).cumsum()
# all sleep chunks
awake_df = (df.set_index('index')
.groupby('block')[['HeartRate_smooth']]
.apply(lambda x: x if len(x) > 1 else None)
)
輸出awake_df
:
+--------+----------------------+-------------------+
| | | HeartRate_smooth |
+--------+----------------------+-------------------+
| block | index | |
+--------+----------------------+-------------------+
| 0 | 2018-01-01 00:07:00 | 58.000000 |
| | 2018-01-01 00:13:00 | 59.333333 |
| | 2018-01-01 00:14:00 | 57.333333 |
| | 2018-01-01 00:20:00 | 59.333333 |
| | 2018-01-01 00:21:00 | 59.333333 |
| | 2018-01-01 00:22:00 | 57.333333 |
| | 2018-01-01 00:34:00 | 59.666667 |
| | 2018-01-01 00:36:00 | 58.666667 |
| | 2018-01-01 00:37:00 | 57.666667 |
| | 2018-01-01 00:38:00 | 55.000000 |
| | 2018-01-01 00:39:00 | 58.333333 |
| | 2018-01-01 01:03:00 | 57.666667 |
| | 2018-01-01 01:08:00 | 59.666667 |
| | 2018-01-01 01:09:00 | 56.333333 |
| | 2018-01-01 01:10:00 | 54.666667 |
| | 2018-01-01 01:32:00 | 59.666667 |
| | 2018-01-01 01:33:00 | 57.000000 |
| | 2018-01-01 01:34:00 | 54.333333 |
| | 2018-01-01 01:56:00 | 56.000000 |
| | 2018-01-01 01:57:00 | 58.000000 |
| | 2018-01-01 01:58:00 | 59.000000 |
| | 2018-01-01 02:03:00 | 59.666667 |
| | 2018-01-01 02:07:00 | 58.666667 |
| 1 | 2018-01-01 03:00:00 | 59.666667 |
| | 2018-01-01 03:09:00 | 59.333333 |
| | 2018-01-01 03:10:00 | 58.333333 |
| | 2018-01-01 03:31:00 | 58.666667 |
+--------+----------------------+-------------------+
請注意,有兩個睡眠塊,因為您的數據實際上在02:07
到03:00
之間有53分鍾的間隙。 並獲得睡眠時間:
(awake_df.reset_index(level=1)
.groupby('block')['index']
.apply(lambda x: x.max()-x.min())
)
得到:
block
0 02:00:00
1 00:22:00
Name: index, dtype: timedelta64[ns]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.