我有一个数据框,其中包含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并不总是有值。我试图在一个循环(逐行)中执行上述操作,以便我可以测试是否存在值,并在值存在时运行布尔查询。但效率极低,可能需要数天才能完成(!)。
如果有人提出任何有效的建议,我将永远感激不尽!
答案 0 :(得分:0)
如果我理解你的例子,你想要在给定的时间过滤time
某些东西有什么中断吗? (在11am
和12am
之间,或3pm
和4pm
之间。
所以,另一个逻辑是:
# 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
错误。