[英]How to count no. of rows between time intervals(hourly) in pandas?
我的数据有各种列,包括日期和时间列。 数据跨越三个月。 我需要数一下。 与日期无关的特定小时内的行数。 所以这意味着在 00:00 到 01:00 window 和类似的 rest 23 小时内获取行数。 我怎么做? 总的来说,我将有 24 行的计数。 这是我的数据:
>>>df[["date","time"]]
date time
0 2006-11-10 00:01:21
1 2006-11-10 00:02:26
2 2006-11-10 00:02:38
3 2006-11-10 00:05:38
4 2006-11-10 00:05:38
Output 应该像:
00:00-00:59 SomeCount
两者都是 object 类型
我认为最简单的是将两列都转换为日期时间,并通过Series.dt.hour
和Series.value_counts
来计算小时数:
out = pd.to_datetime(df["date"] + ' ' + df["time"]).dt.hour.value_counts().sort_index()
或者,如果需要您的格式,请使用Series.dt.strftime
和GroupBy.size
:
s = pd.to_datetime(df["date"] + ' ' + df["time"]).dt.strftime('%H:00-%H:59')
print (s)
0 00:00-00:59
1 00:00-00:59
2 00:00-00:59
3 00:00-00:59
4 00:00-00:59
dtype: object
out = s.groupby(s, sort=False).size()
print (out)
00:00-00:59 5
dtype: int64
最后为 DataFrame 使用:
df = out.rename_axis('times').reset_index(name='count')
您可以使用分隔符:
分割时间字符串。 然后为小时创建另一个列hour
。 然后使用groupby()
根据新列hour
对它们进行分组。 您现在可以将数据存储在新系列或 dataframe 中以获得所需的 output
groupby()
小时import io
df = pd.read_csv(io.StringIO(""" date time
0 2006-11-10 00:01:21
1 2006-11-10 00:02:26
2 2006-11-10 00:02:38
3 2006-11-10 00:05:38
4 2006-11-10 02:05:38"""), sep="\s\s+", engine="python")
dfc = (df.groupby(pd.to_datetime(df.time).dt.hour)
.apply(lambda d: pd.DataFrame({"count":[len(d)]},
index=[pd.to_datetime(d["time"]).min().strftime("%H:%M")
+"-"+pd.to_datetime(d["time"]).max().strftime("%H:%M")]))
.reset_index()
.drop(columns=["time"])
.rename(columns={"level_1":"time"})
)
时间 | 数数 | |
---|---|---|
0 | 00:01-00:05 | 4 |
1 | 02:05-02:05 | 1 |
我的解决方案生成所有24 小时的行计数,源 DataFrame 中“不存在”的小时数为0 。
为了展示一个更有启发性的例子,我定义了源 DataFrame 包含几个小时的行:
date time
0 2006-11-10 01:21:00
1 2006-11-10 02:26:00
2 2006-11-10 02:38:00
3 2006-11-10 05:38:00
4 2006-11-10 05:38:00
5 2006-11-11 05:43:00
6 2006-11-11 05:51:00
请注意,最后 2 行来自不同的日期,但由于您只想按小时分组,它们将被计入与前 2 行(小时5 )相同的组中。
第一步是创建一个包含几乎你想要的东西的系列:
wrk = df.groupby(pd.to_datetime(df.time).dt.hour).apply(
lambda grp: grp.index.size).reindex(range(24), fill_value=0)
wrk的初始部分是:
time
0 0
1 1
2 2
3 0
4 0
5 4
6 0
7 0
左列(索引)包含作为integer的小时,右列是计数 - 这个小时有多少行。
唯一要做的就是将索引重新格式化为您想要的格式:
wrk.index = wrk.index.map(lambda h: f'{h:02}:00-{h:02}:59')
结果(仅初始部分)是:
time
00:00-00:59 0
01:00-01:59 1
02:00-02:59 2
03:00-03:59 0
04:00-04:59 0
05:00-05:59 4
06:00-06:59 0
07:00-07:59 0
但是,如果您只想获取源数据中存在的小时数,请从上面的代码中删除.reindex(…)
。
那么您的(完整)结果,对于上述 DataFrame 将是:
time
01:00-01:59 1
02:00-02:59 2
05:00-05:59 4
dtype: int64
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.