Python 基于比较datetime64时间戳的多个条件创建掩码
我有一个数据框,它有7列datetime64格式的时间戳。前两列是“Time_in”和“Time_out”,表示一天的开始和结束。接下来的两列是“Time\u in1”和“Time\u out1”。最后两个是“时间2”和“时间2”。最后一组时间介于“输入时间”和“输出时间”之间。最后一列是“时间”,与所有其他列进行比较。此数据框中的一个示例可以是(格式也有年-月-日,但我只是通过显示时间来简化): 时间=上午9点 超时=下午5点 时间为上午11点 时间=下午12点 时间2=下午3点 时间2=下午4点 我想创建一个掩码列,如果:Python 基于比较datetime64时间戳的多个条件创建掩码,python,datetime,pandas,Python,Datetime,Pandas,我有一个数据框,它有7列datetime64格式的时间戳。前两列是“Time_in”和“Time_out”,表示一天的开始和结束。接下来的两列是“Time\u in1”和“Time\u out1”。最后两个是“时间2”和“时间2”。最后一组时间介于“输入时间”和“输出时间”之间。最后一列是“时间”,与所有其他列进行比较。此数据框中的一个示例可以是(格式也有年-月-日,但我只是通过显示时间来简化): 时间=上午9点 超时=下午5点 时间为上午11点 时间=下午12点 时间2=下午3点 时间2=下午
时间>=time\u in和time如果我理解你的例子,你想过滤一下在给定的时间
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)))
您可以在这里使用任何类型的比较(我很喜欢query
方法),但解决问题的方法是编写逻辑,将丢失的条目替换为过去的datetimes
,从而消除
TypeError: Cannot compare type 'Timestamp' with type 'str'
错误。如果我理解你的例子,你想过滤一下在给定的时间
时间
某个东西是否有某种中断?(在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)))
您可以在这里使用任何类型的比较(我很喜欢query
方法),但解决问题的方法是编写逻辑,将丢失的条目替换为过去的datetimes
,从而消除
TypeError: Cannot compare type 'Timestamp' with type 'str'
错误。非常感谢您的回复,克里斯。我不知道熊猫的查询方法。我对它的语法有点不熟悉;我以前从未使用过@符号-这是否像编码@column_name那样简单(或者我有点偏离基准)?另外,您能告诉我query是否在数据帧上按行跨列执行操作吗?谢谢,我现在正在看一些文档!如果您尚未找到该页面:。查询字符串可以这样解释:
.query(“column\u name\u of\u dataframe=='somestring')
。如果要使用变量而不是字符串(或数值),则可以使用@
。这意味着以下单词是一个变量(值将被替换)。谢谢@chris-sc。我也一直在看本页上的示例:。但是,当我尝试在同一数据帧中基于感兴趣的三列创建一个新列时,出现了一个错误:df['boolean']=df.query((Time_in=timestamp)”),我得到了错误:**ValueError:传递的项数错误30,位置意味着1当我添加@符号时,变量不再被识别。非常感谢你的回复。我不知道熊猫的查询方法。我对它的语法有点不熟悉;我以前从未使用过@符号-这是否像编码@column_name那样简单(或者我有点偏离基准)?另外,您能告诉我query是否在数据帧上按行跨列执行操作吗?谢谢,我现在正在看一些文档!如果您尚未找到该页面:。查询字符串可以这样解释:.query(“column\u name\u of\u dataframe=='somestring')
。如果要使用变量而不是字符串(或数值),则可以使用@
。这意味着以下单词是一个变量(值将被替换)。谢谢@chris-sc。我也一直在看本页上的示例:。但是,当我尝试在同一数据帧中基于感兴趣的三列创建一个新列时,出现了一个错误:df['boolean']=df.query((Time_in=timestamp)”),我得到了错误:**ValueError:传递的项数错误30,位置意味着1当我添加@符号时,变量不再被识别。
# 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)))
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)))")
TypeError: Cannot compare type 'Timestamp' with type 'str'