根据比较datetime64时间戳的多个条件创建掩码

时间:2015-08-11 05:09:43

标签: python datetime pandas

我有一个数据框,其中包含7列时间戳,采用datetime64格式。前两列是'Time_in'和'Time_out',表示一天的开始和结束。接下来的两列是'Time_in1'和'Time_out1'。最后两个是'Time_in2'和'Time_out2'。最后几组时间介于'Time_in'和'Time_out'之间。最后一列是“时间”,比较所有其他列。这个数据框中的一个例子可能是(格式也有年 - 月 - 日,但我只是通过显示时间来简化):

Time_in = 9am

Time_out = 5pm

Time_in1 = 11am

Time_out1 = 12pm

Time_in2 = 3pm

Time_out2 = 4pm

我想在以下情况下创建一个True列的掩码列:

时间> = Time_in和时间< = Time_out

时间< = Time_in1和时间> = Time_out1

时间< = Time_in2和时间> = Time_out2

第一部分的工作原理如下:

df['wearing_time'] = ((df['time']>=flmerge.Time_in) & (df['time']<=df.Time_out))

我相信这是有效的,因为没有空白值。

但是,我尝试了以下但没有成功:

df['wearing_time'] = ((df['time']>=flmerge.Time_in) & (df['time']<=df.Time_out)) and ((df['time']>=df.Time_out1) and (df['time']<=df.Time_in1)) and ((df['time']>=df.Time_out2) & (df['time']<=df.Time_in2))

以及:

df['wearing_time'] = ((df['time']>=dfe.Time_in) & (df['time']<=df.Time_in1) & (df['time']>=df.Time_out1) & (df['time']<=df.Time_in2) & (flmerge['time']>=df.Time_out2) & (df['time']<=df.Time_out))

会出现以下错误:

TypeError: Cannot compare type 'Timestamp' with type 'str'

我认为问题在于Time_in1 / Time_in2或Time_out1 / Time_out2并不总是有值。我试图在一个循环(逐行)中执行上述操作,以便我可以测试是否存在值,并在值存在时运行布尔查询。但效率极低,可能需要数天才能完成(!)。

如果有人提出任何有效的建议,我将永远感激不尽!

1 个答案:

答案 0 :(得分:0)

如果我理解你的例子,你想要在给定的时间过滤time某些东西有什么中断吗? (在11am12am之间,或3pm4pm之间。

所以,另一个逻辑是:

# working hours:
(Time_in <= @time) and (Time_out >= @time)
# not in a break:
and not (((Time_in1 <= @time) and (Time_out1 >= @time)) or
((Time_in2 <= @time) and (Time_out2 >= @time)))

如果你现在假设某个/没有Time_in1/Time_out1的人没有休息,你可以用查询之外的日期时间替换空字符串(或NaNs),例如:< / p>

import datetime
df.replace(np.NaN, datetime.datetime(1900, 1, 1, 0, 0), inplace=True)

time = datetime.datetime(2015, 8, 11, 15, 0)

times = df2.query("(Time_in <= @time) and (Time_out >= @time)
      and not (((Time_in1 <= @time) and (Time_out1 >= @time)) or
      ((Time_in2 <= @time) and (Time_out2 >= @time)))")

你可以在这里使用任何类型的比较(我只是喜欢query方法),但是解决你的问题的想法是以缺少的条目可以用{{1}替换的方式编写你的逻辑从过去开始,摒弃

datetimes

错误。