从星期几和时间中选择时段

时间:2018-02-24 12:50:53

标签: python pandas

            A         B          C
0  2001-01-13  10:00:00   Saturday
1  2001-01-14  12:33:00     Sunday
2  2001-01-20  15:10:00   Saturday
3  2001-01-24  13:15:00  Wednesday
4  2001-01-24  16:56:00  Wednesday
5  2001-01-24  19:09:00  Wednesday
6  2001-01-28  19:14:00     Sunday
7  2001-01-29  11:00:00     Monday
8  2001-01-29  23:50:00     Monday
9  2001-01-30  11:50:00    Tuesday
10 2001-01-30  13:00:00    Tuesday
11 2001-02-02  16:14:00  Wednesday
12 2001-02-02  09:25:00     Friday

我想创建一个新的df,其中包含所有句点之间的行,从周一的12:00:00到周三的17:00:00

输出结果为:

            A         B          C
3  2001-01-24  13:15:00  Wednesday
5  2001-01-24  16:56:00  Wednesday
8  2001-01-29  23:50:00     Monday
9  2001-01-30  11:50:00    Tuesday
10 2001-01-30  13:00:00    Tuesday
11 2001-02-02  16:14:00  Wednesday

我试过

df[(df["B"] >= "12:00:00") & (df["B"] <= "17:00:00")] & df[(df["C"] >= "Monday") & (df["C"] <= "Wednesday")]

但这不是我想要的。

谢谢。

2 个答案:

答案 0 :(得分:0)

使用OR(|)运算符和等号(=),而不是&amp;和&lt; =,&gt; =)。希望能帮助到你。感谢。

old: df[(df["B"] >= "12:00:00") & (df["B"] <= "17:00:00")] & df[(df["C"] >= "Monday") & (df["C"] <= "Wednesday")]
New: df[(df["B"] >= "12:00:00") & (df["B"] <= "17:00:00")] & (df[(df["C"] = "Monday") | (df["C"] = "Tuesday") | (df["C"] = "Wednesday"))]

答案 1 :(得分:0)

你可以创建3个布尔值掩码并按boolean indexing过滤 - 首先是开始时间的第一天,第二天是最后一天和结束时间的最后一天和结束时间:

from datetime import time
#if necessary convert to datetime
df['A'] = pd.to_datetime(df['A'])
#if necessary convert to times
df['B'] = pd.to_datetime(df['B']).dt.time

m1 = (df['B']>=time(12)) & (df['C'] == 'Monday')
m2 = (df['C'] == 'Tuesday')
m3 = (df['B']<=time(17)) & (df['C'] == 'Wednesday')
df = df[m1 | m2 | m3]
print (df)
            A         B          C
3  2001-01-24  13:15:00  Wednesday
4  2001-01-24  16:56:00  Wednesday
8  2001-01-29  23:50:00     Monday
9  2001-01-30  11:50:00    Tuesday
10 2001-01-30  13:00:00    Tuesday
12 2001-02-02  09:25:00  Wednesday

MondayFriday的同一时间的另一种解决方案:

from datetime import time
df['A'] = pd.to_datetime(df['A'])
df['B'] = pd.to_datetime(df['B']).dt.time

m1 = (df['B']>=time(12)) & (df['C'] == 'Monday')
m2 = df['C'].isin(['Tuesday', 'Wednesday'])
m3 = (df['B']<=time(17)) & (df['C'] == 'Friday')
df = df[m1 | m2 | m3]
print (df)
            A         B          C
3  2001-01-24  13:15:00  Wednesday
4  2001-01-24  16:56:00  Wednesday
5  2001-01-24  19:09:00  Wednesday
8  2001-01-29  23:50:00     Monday
9  2001-01-30  11:50:00    Tuesday
10 2001-01-30  13:00:00    Tuesday
11 2001-02-02  16:14:00     Friday
12 2001-02-02  09:25:00  Wednesday