这是我的桌子
timestamp date month day hour price
0 2017-01-01 00:00 01/01/2017 Jan Sun 00:00 60.23
1 2017-01-01 01:00 01/01/2017 Jan Sun 01:00 60.73
2 2017-01-01 02:00 01/01/2017 Jan Sun 02:00 75.99
3 2017-01-01 03:00 01/01/2017 Jan Sun 03:00 60.76
4 2017-01-01 04:00 01/01/2017 Jan Sun 04:00 49.01
我每天24小时都有数据,每天都有一整年的数据.
例如,我想将每个季节的数据分组为工作日和周末
Weekend_Winter =所有星期六和星期日的数据,分别为11月,12月,1月,2月
相当新手,所以任何帮助都会有用
最佳答案 如果想要按条件筛选数据,请使用
boolean indexing
与比较
dayofweek
创建的布尔掩码和
isin
作为列表L中的检查成员资格:
#changed timestamp values only for better sample
print (df)
timestamp date month day hour price
0 2017-01-01 00:00:00 01/01/2017 Jan Sun 00:00 60.23
1 2017-01-03 00:00:00 01/01/2017 Jan Sun 00:00 60.23
2 2017-02-01 01:00:00 01/01/2017 Jan Sun 01:00 60.73
3 2017-02-05 01:00:00 01/01/2017 Jan Sun 01:00 60.73
4 2017-03-01 02:00:00 01/01/2017 Jan Sun 02:00 75.99
5 2017-04-01 03:00:00 01/01/2017 Jan Sun 03:00 60.76
6 2017-11-01 04:00:00 01/01/2017 Jan Sun 04:00 49.01
L = ['Nov','Dec','Jan','Feb']
mask = (df['timestamp'].dt.dayofweek > 4) & (df['month'].isin(L))
df1 = df[mask]
print (df1)
timestamp date month day hour price
0 2017-01-01 00:00:00 01/01/2017 Jan Sun 00:00 60.23
3 2017-02-05 01:00:00 01/01/2017 Jan Sun 01:00 60.73
5 2017-04-01 03:00:00 01/01/2017 Jan Sun 03:00 60.76
如果需要season的新列和日期类型:
df['season'] = (df['timestamp'].dt.month%12 + 3) // 3
df['state'] = np.where(df['timestamp'].dt.dayofweek > 4, 'weekend','weekdays')
print (df)
timestamp date month day hour price season state
0 2017-01-01 00:00:00 01/01/2017 Jan Sun 00:00 60.23 1 weekend
1 2017-01-03 00:00:00 01/01/2017 Jan Sun 00:00 60.23 1 weekdays
2 2017-02-01 01:00:00 01/01/2017 Jan Sun 01:00 60.73 1 weekdays
3 2017-02-05 01:00:00 01/01/2017 Jan Sun 01:00 60.73 1 weekend
4 2017-03-01 02:00:00 01/01/2017 Jan Sun 02:00 75.99 2 weekdays
5 2017-04-01 03:00:00 01/01/2017 Jan Sun 03:00 60.76 2 weekend
6 2017-11-01 04:00:00 01/01/2017 Jan Sun 04:00 49.01 4 weekdays
并且它可以用于具有聚合的groupby,例如总和:
df2 = df.groupby(['season','state'], as_index=False)['price'].sum()
print (df2)
season state price
0 1 weekdays 120.96
1 1 weekend 120.96
2 2 weekdays 75.99
3 2 weekend 60.76
4 4 weekdays 49.01