python-3.x - 每晚重采样 DataFrame
问题描述
我有一个标记事件的 DataFrame。我需要计算每晚这些事件的数量,例如晚上 19:00 之后到早上 08:00 之前。
我正在考虑使用count()
,但我的困难在于夜间切换日期。
我不想要df.resample("d").count()
,因为这将计算每个日历日的所有事件,即 00::00 到 24:00。我想要从 19:00 到第二天 08:00 的所有事件。
这里的示例代码将在随机时间每晚生成 80 到 120 个事件:
np.random.seed(843)
rand_times = []
for i in range(5):
rand_times.extend([datetime.datetime(2015,8,i+12,20,0,0) + pd.Timedelta(k, unit="m") for k in np.random.randint(600, size=np.random.randint(low=80, high=120))])
rand_times.sort()
df = pd.DataFrame(["1234"]*len(rand_times), index=rand_times, columns=["participant_ID"])
df.head()
participant_ID
2015-08-12 20:02:00 1234
2015-08-12 20:12:00 1234
2015-08-12 20:15:00 1234
2015-08-12 20:19:00 1234
2015-08-12 20:21:00 1234
到目前为止,我所做的是每晚手动访问,通过循环访问它们:
for i in range(5):
print(df.loc[(df.index >= datetime.datetime(2015,8,12+i,20,0,0)) & (df.index <= datetime.datetime(2015,8,12+i+1,8))].count())
participant_ID 115
dtype: int64
participant_ID 90
dtype: int64
participant_ID 110
dtype: int64
participant_ID 114
dtype: int64
participant_ID 87
dtype: int64
有没有更简单的方法来做到这一点?我需要进一步处理这些信息,计算每晚每小时的事件数等。
任何帮助表示赞赏!
解决方案
我找到了一个适合我的解决方案,使用多索引。基于上面给出的示例代码。
df_new = []
for i in range(5):
# iterates through every night
snipped = df.index[(df.index >= datetime.datetime(2015,8,12+i,20,0,0)) & (df.index <= datetime.datetime(2015,8,12+i+1,8))]
for row in snipped:
df_new.append((snipped[0].date(), row))
# create MultiIndex object
myindex = pd.MultiIndex.from_tuples(df_new, names=["day", "time"])
# create new DataFrame using this multi index
DF = pd.DataFrame(list(df["participant_ID"]), index=myindex, columns=["participant_id"])
# access by night ( first level of multi index)
DF.groupby(pd.Grouper(level=0)).count()
day
2015-08-12 115
2015-08-13 90
2015-08-14 110
2015-08-15 114
2015-08-16 87
我是多索引的新手,很高兴能改进这个建议。
推荐阅读
- python-3.x - 如何在div标签下抓取多个图像标签
- javascript - Javascript替换方法对我不起作用?
- javascript - 无论行数和列数如何,都可以将网格放入 div
- excel - 折线图中 X 轴上未正确显示日期
- c++ - 如何在代码中显示模拟,为每个搜索会话打印数组并最后打印总比较?
- java - 检查字符串是否包含字母
- jquery - 对某些 Datatable 列进行排序时出错,但是当我评论“ServerSide”代码时这是正常的(CodeIgniter 4)
- node.js - 我可以在 React 应用程序中使用节点“child_process”吗?
- jenkins - 如何根据来自 Build Failure Analyzer Jenkins 插件的错误类别发送电子邮件/触发参数化远程作业?
- python - 梯度检查点返回值