我进行了广泛的搜索,但还没有找到一个好的方法来做到这一点。我有一个带有我自己的短信数据的 pandas 数据框。它有“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()
有更好的方法吗?
最佳答案
IIUC,您需要从 'utctime' 中提取小时和分钟,将分钟分类在 bins
中并执行groupby
关于 count
的小时和分钟_bins消息数:
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
关于python - 如何在一段时间内使用 pandas groupby 来查找同一时间段内多年来的平均计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53682428/