【问题标题】:Create 15minute time intervals from given time in a column and find count of values in each time interval从给定时间在一列中创建 15 分钟的时间间隔,并在每个时间间隔中查找值的计数
【发布时间】:2022-01-26 07:02:19
【问题描述】:

鉴于此数据集包含事件的日期时间票务扫描的日期时间

event_name event_datetime scan_datetime
Game 1 2018-10-17 19:30:00 2018-10-17 20:01:20
2018-10-17 19:20:10
2018-10-17 21:44:43
2018-10-17 20:30:46
2018-10-17 19:51:56
... ... ...
Game 2 2019-04-10 19:30:00 2019-04-10 19:39:35
2019-04-10 30:30:49
2019-04-10 20:41:10
2019-04-10 19:46:20
2019-04-10 22:24:19

所需的输出应该是 event_datetime 之前和之后每 15 分钟时间间隔的列,其值为 scan_datetime

Time_intervals 90-75 75-60 60-45 45-30 30-15 15-0 0-15 15-30 30-45 45-60
count 2 1 5 6 4 3 25 7 4 1

【问题讨论】:

  • 那么你的问题是什么?只需对每个事件的 scan_datetimes 进行排序,并按从早到晚的顺序创建间隔并填充此 Time_intervals。
  • 您想要汇总所有游戏还是为每个游戏单独创建一个?
  • scan_datetime 是列表吗?
  • @BorutFlis 我想要所有游戏的聚合。将创建一个新表,其间隔基于旧表。
  • @Corralien 不。它实际上是表中的一行值,event_nameevent_datetime 对于该行是通用的。

标签: python pandas datetime


【解决方案1】:

首先,您需要从scan_datetime 列中提取日期时间,然后将其分解。 接下来,计算event_datetimescan_datetime 列之间的时间增量。最后,bin 值和计数出现次数。

DT = r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'
df['scan_datetime'] = df['scan_datetime'].str.findall(DT)

df = df.explode('scan_datetime').astype({'event_datetime': 'datetime64', 
                                         'scan_datetime': 'datetime64'})

df['diff'] = df['event_datetime'].sub(df['scan_datetime']).dt.total_seconds().div(60)

bins = np.arange(24*-15, 24*15+1, 15)
labels = [f'{abs(i)}-{abs(j)}' for i, j in zip(bins, bins[1:])]

out = pd.cut(df['diff'], bins=bins, labels=labels) \
        .value_counts(sort=False).to_frame('count').T

输出:

>>> out
       180-165  165-150  150-135  135-120  120-105  105-90  90-75  75-60  60-45  45-30  ...  30-45  45-60  60-75  75-90  90-105  105-120  120-135  135-150  150-165  165-180
count        1        0        0        1        0       0      0      3      0      1  ...      0      0      0      0       0        0        0        0        0        0

[1 rows x 24 columns]

【讨论】:

    【解决方案2】:

    首先你在 scan_datetime 中分解列表。

    df = df.explode("scan_datetime").reset_index(drop=True)
    

    这将使每次扫描成为单独的行。我假设列表中的值是字符串,所以我们将它们转换为日期时间:

    df["scan_datetime"] = pd.to_datetime(df["scan_datetime"])
    

    比你计算的差:

    df["diff"] = df["event_datetime"] - df["scan_datetime"]
    df["diff"] = (df["diff"].dt.total_seconds()/60).astype(int)
    

    现在您以分钟为单位的差异(有符号整数)。比您以指定的时间间隔运行值计数。

    df["diff"].value_counts(bins=[-90,-75,-60, -45, -30, -15, 0, 15, 30, 45, 60])
    

    【讨论】:

    • 正是我想要的!谢谢
    • @sais。你说scan_datetime 不是列表?
    • 您应该接受其中一个答案,它们都是正确的。 @Corralien 的解决方案更好,因为它考虑了日期为字符串的情况。
    猜你喜欢
    • 2016-08-18
    • 2013-01-23
    • 2017-01-10
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多