根据时间列的内容分隔熊猫数据框

时间:2019-03-28 11:24:54

标签: python python-3.x pandas datetime

我有一个熊猫数据框,其中一栏是日期时间。数据跨越一个月,并按时间升序排序。现在我要分离出周末和工作日的数据,这是我的代码:

data = pd.read_csv('Data.csv')
data.head()

              Time                     A       B      C
0    2018-12-26 14:04:05.519842       276     120     76
1    2018-12-26 14:05:05.730416       52      52      12
2    2018-12-26 14:07:07.791897       52      52      12
3    2018-12-26 14:08:05.373717       200     210     40
4    2018-12-26 14:10:05.861872       40      106     0

引入一个称为工作日的新列

data['weekday'] = data['Time'].apply(lambda x: x.weekday())

weekday_data = data[data['weekday'] < 5 ].drop(columns=['weekday'])
weekend_data = data[data['weekday'] >= 5 ].drop(columns=['weekday'])

因此weekday_data包含周一至周五的所有数据,weekend_data包含周六和周日的所有数据。

现在,我希望周末数据包含从星期五下午5点开始的所有数据(不是星期五的所有数据)到星期日23:59:00。
注意:必须像我的原始数据一样对2个输出数据帧(weekday_dataweekend_data)进行时间排序。

我该如何实现?

1 个答案:

答案 0 :(得分:1)

使用:

rng = pd.date_range('2019-03-29 11:00:00', periods=30, freq='3H')
data = pd.DataFrame({'Time': rng, 'a': range(len(rng))})  
print (data)
                  Time   a
0  2019-03-29 11:00:00   0
1  2019-03-29 14:00:00   1
2  2019-03-29 17:00:00   2
3  2019-03-29 20:00:00   3
4  2019-03-29 23:00:00   4
5  2019-03-30 02:00:00   5
6  2019-03-30 05:00:00   6
7  2019-03-30 08:00:00   7
8  2019-03-30 11:00:00   8
9  2019-03-30 14:00:00   9
10 2019-03-30 17:00:00  10
11 2019-03-30 20:00:00  11
12 2019-03-30 23:00:00  12
13 2019-03-31 02:00:00  13
14 2019-03-31 05:00:00  14
15 2019-03-31 08:00:00  15
16 2019-03-31 11:00:00  16
17 2019-03-31 14:00:00  17
18 2019-03-31 17:00:00  18
19 2019-03-31 20:00:00  19
20 2019-03-31 23:00:00  20
21 2019-04-01 02:00:00  21
22 2019-04-01 05:00:00  22
23 2019-04-01 08:00:00  23
24 2019-04-01 11:00:00  24
25 2019-04-01 14:00:00  25
26 2019-04-01 17:00:00  26
27 2019-04-01 20:00:00  27
28 2019-04-01 23:00:00  28
29 2019-04-02 02:00:00  29

不需要新的列,通过Series.dt.weekday创建掩码,然后将>5的{​​{1}}与另外一个掩码的按位|连接起来的OR Series.dt.hour s-由Fridays链接为按位的&

AND

m1 = data['Time'].dt.weekday >= 5
m2 = (data['Time'].dt.weekday == 4) & (data['Time'].dt.hour >= 17)
m = m1 | m2

weekend_data = data[m]    
weekday_data = data[~m]

print (weekend_data)
                  Time   a
2  2019-03-29 17:00:00   2
3  2019-03-29 20:00:00   3
4  2019-03-29 23:00:00   4
5  2019-03-30 02:00:00   5
6  2019-03-30 05:00:00   6
7  2019-03-30 08:00:00   7
8  2019-03-30 11:00:00   8
9  2019-03-30 14:00:00   9
10 2019-03-30 17:00:00  10
11 2019-03-30 20:00:00  11
12 2019-03-30 23:00:00  12
13 2019-03-31 02:00:00  13
14 2019-03-31 05:00:00  14
15 2019-03-31 08:00:00  15
16 2019-03-31 11:00:00  16
17 2019-03-31 14:00:00  17
18 2019-03-31 17:00:00  18
19 2019-03-31 20:00:00  19
20 2019-03-31 23:00:00  20