我想过滤我拥有的数据点,直到我只有参与者睡着的数据点。我有我的dataframe与日期时间值和我正在研究的值,和一个不同的dataframe,有当参与者开始睡觉,当他们结束睡眠。我想知道是否有一种方法可以通过迭代大 Dataframe 或具有开始和结束睡眠时间的 Dataframe 来实现这一点,而不是必须在布尔掩码中写出每个开始和停止时间,或者任何其他比手动输入175个夜晚更好的方法。
开始/停止数据框看起来像这样,我为每个参与者都有一个:
df_sleep1:
date start stop
5/30/2023 5/29/2023 22:15 5/30/2023 7:22
5/31/2023 5/30/2023 23:19 5/31/2023 6:46
6/1/2023 6/1/2023 0:02 6/1/2023 8:31
包含所有数据的dataframe看起来像这样,我想在其中添加一个“asleep”列:
df:
DateTime HeartRate Participant Asleep
0 2023-05-29 23:44:00 76.0 1
1 2023-05-30 06:44:00 76.0 1
2 2023-05-30 20:45:00 84.0 1
3 2023-05-31 04:45:00 84.0 2
4 2023-06-1 20:46:00 81.0 2
我所尝试的:
dt = df['DateTime'].to_numpy()
start1 = df_sleep1['Start'].to_numpy()[:, None]
end1 = df_sleep1['Stop'].to_numpy()[:, None]
mask1 = ((start1 <= dt) & (dt <= end1) & (df['Participant'] == 1))
df['Sleep'] = mask1.any(axis=0)
def sleepFunction(row):
if (df_sleep1['Start'] <= dt) & (dt <= df_sleep1['Stop']) & (df['Participant'] == 1):
return True
else:
return False
df['sleepState'] = df.apply(lambda row: sleepFunction(row), axis = 1)
两者都给予了类似的错误,关于 Dataframe /数组的形状不匹配,这不是我想做的事情。
2条答案
按热度按时间z9zf31ra1#
如果间隔不重叠,则有效的方法是使用
merge_asof
:按参与者在开始日期合并,然后确保该日期在结束日期之后。输出:
m3eecexj2#
是的,您可以使用布尔掩码来查找DateTime值是否福尔斯不同 Dataframe 中的其他两个DateTime值之间。这里有一个方法:
这将在
df
Dataframe 中创建一个“Asleep”列,当参与者睡着时,值为True,当参与者没有睡着时,值为False。