python - 使用 Python/Pandas 以 csv 中的开始时间和结束时间日期时间列按小时分组
问题描述
我只是在 Pandas 中弄湿我的脚趾并且被卡住了。我想按小时聚合 CSV 中的事件(获取计数),并在事件中有一个开始时间和结束时间。
即一个例子是:
event, start, end
soccer, 2020-01-20 00:34:00, 2020-01-20 02:34:00,
football, 2020-01-20 00:34:00, 2020-01-20 01:34:00
etc
预期输出:
00:00:00 - 2 (both began in 0th hour and went to 1st hour)
01:00:00 - 2 (both were live in 1st hour)
02:00:00 - 1 (only soccer occurred in 02 hour)
你会怎么做?我一直在尝试重新索引、重新采样、时差、时间索引——所有这些都没有运气。
解决方案
您想要的实际上是事件发生时间的频率分布。首先,您需要通过创建一个范围然后分解它来生成从中获取分布的样本:
hours = events.apply(lambda row: range(row['end'].hour - row['start'].hour + 1), axis=1).explode()
0 0
0 1
0 2
1 0
1 1
dtype: object
不要忘记在 end 和 start 之间的差异上加一个来说明fencepost error。然后只需获取样本的值计数。要按小时而不是按递减计数来获取频率,请通过sort=False
.
hours.value_counts(sort=False)
0 2
1 2
2 1
dtype: int64
推荐阅读
- python - 配置 Snappy 时出错。失败,返回码 10
- airflow - 气流计划未更新
- javascript - JavaScript 命令、函数和内置函数的列表或正则表达式
- windows-runtime - 断开连接后访问设备时WinRT/CPP应用程序退出
- javascript - 即使创建了索引,Firestore 检索文档也非常慢
- java - StatefulBeanToCsv 不会将完整的字段写入 CSV,
- javascript - JavaScript 变量是引用、值还是指针
- r - Rscript & rstan 作为 cron 作业运行时的不同行为
- twitter - 在 twitter 中获取不记名令牌的问题
- android - 如何将 TextView 和 ImageView 放在一行中?