在pandas数据框中获取开始和结束时间范围内的小时数,并按值对它们进行分组

8xiog9wr  于 2023-05-21  发布在  其他
关注(0)|答案(2)|浏览(136)

我有一个dataframe,它有两个列:'start_time'和'end_time'
| 开始时间|结束时间|
| --------------|--------------|
| 十点整|14点整|
| 13点整|20点整|
| 十二点|15点整|
| 13点整|19点整|
| 十一点整|15点整|
| 九点整|14点整|
我想得到每一行之间的时间,就像它们是约会一样。例如,第一行具有时间:10:00:00、11:00:00、12:00:00和13:00:00(14:00:00没有预约,因为那是“结束”时间)。
最后,我想按价值对这些时间进行分组。最后的dataframe应该是这样的:
| 时间|计数|
| --------------|--------------|
| 十点整|5|
| 十一点整|四|
| 十二点|七|
| 13点整|1|
| 14点整|六|
我所说的count是指每次一个值在该行的范围内(即在前2行中,值“13:00:00”出现2次)。
谢谢大家!

5ssjco0h

5ssjco0h1#

这给出了每个时间在其中一个间隔中发生的频率的计数(假设每个开始和结束时间是一个完整的小时,并且每个间隔仅跨越一天):

import pandas as pd

s="""10:00:00   14:00:00
13:00:00    20:00:00
12:00:00    15:00:00
13:00:00    19:00:00
11:00:00    15:00:00
09:00:00    14:00:00"""
columns = ["start_time", "end_time"]
df = pd.DataFrame([r.split('\t') for r in s.split('\n')], columns=columns)

to_h = lambda x: int(x[:2])
hours = []
for s, e in zip(df.start_time.apply(to_h), df.end_time.apply(to_h)):
    hours.extend(list(range(s, e)))

df2 = pd.DataFrame(pd.Series(hours).value_counts())
df2.reset_index(inplace=True)
df2.rename(columns={'index': 'time', 0: 'count'}, inplace=True)
from_h = lambda x: ('' if len(str(x)) == 2 else '0') + str(x) + ':00:00'
df2['time'] = df2['time'].apply(from_h)
print(df2)

印刷品

time  count
0   13:00:00      6
1   12:00:00      4
2   14:00:00      4
3   11:00:00      3
4   10:00:00      2
5   15:00:00      2
6   16:00:00      2
7   17:00:00      2
8   18:00:00      2
9   19:00:00      1
10  09:00:00      1
7d7tgy0s

7d7tgy0s2#

这里有一种方法,使用date_range查找每个start_time/end_time对的所有约会时间,然后exploding结果范围并计算所有不同的时间,然后将结果序列转换为 Dataframe :

res = (df
    .sort_values('start_time')
    .apply(lambda r:pd.date_range(r['start_time'], r['end_time'], freq='1H', inclusive='left').time, axis=1)
    .explode()
    .value_counts(sort=False)
    .to_frame('count')
    .reset_index(names='time')
)

示例数据的输出:

time  count
0   09:00:00      1
1   10:00:00      2
2   11:00:00      3
3   12:00:00      4
4   13:00:00      6
5   14:00:00      4
6   15:00:00      2
7   16:00:00      2
8   17:00:00      2
9   18:00:00      2
10  19:00:00      1

相关问题