我进行了广泛搜索,但是还没有找到一种很好的方法。我有一个带有自己的短信数据的熊猫数据框。它具有“ utctime”,“发件人”,“收件人”和“消息”列。我想做的是将其按任意分钟的时间段(例如10或20分钟)进行分组,然后在多年中查看我每天在该时间段内发送的邮件数量。
数据的前几行看起来像这样,并且延续了2年之久:
utctime sender recipient message
0 2016-11-25 18:00:25.877000+00:00 Person1 Me message1
1 2016-11-25 18:50:58.694000+00:00 Person2 Me message2
2 2016-11-25 18:54:41.871000+00:00 Me Person2 message3
3 2016-11-25 18:54:58.583000+00:00 Person2 Me message4
4 2016-11-25 19:01:19.694000+00:00 Me Person2 message5
什么是最好的方法,这样我可以从00:00到23:40以20分钟的增量看到自己的短信发送频率?
到目前为止,我要做的是拥有另一个功能,可以将时间缩减为一天:
def time_of_day(data, tz_info):
utctime = data.utctime.dt.tz_convert(tz_info)
data['timeofday'] = pd.to_datetime({'year': 2017,
'month': 1,
'day': 1,
'hour': utctime.dt.hour,
'minute': utctime.dt.minute,
'second': utctime.dt.second})
return data
然后我使用自定义石斑鱼分组:
sf = pytz.timezone('US/Pacific')
timedelta = '10min'
grouper = pd.Grouper(key='timeofday', freq=timedelta)
data = time_of_day(data, sf) # data is returned in time of day for tz
freq = data.groupby(grouper).count()
有更好的方法吗?
答案 0 :(得分:2)
IIUC,您需要从“ utctime”中提取小时和分钟,对bins
中的分钟进行分类,并对消息groupby
的小时和分钟bins执行count
:>
df['Hour'] = pd.to_datetime(df['utctime']).dt.hour
df['Minute'] = pd.to_datetime(df['utctime']).dt.minute
df['minute_bins'] = pd.cut(df['Minute'], bins=(-0.01,20,40,60), labels=('0 < 20', '20 < 40', '40 < 60'))
df.groupby(['Hour', 'minute_bins'])['message'].count()
print(df)
Hour minute_bins
18 0 < 20 1
40 < 60 3
19 0 < 20 1