首页 > 解决方案 > 如何根据日期时间差异拆分数据框?

问题描述

假设我有这个数据框,其日期时间由未知的时间间隔分隔:

data[0]:
        mintime                              check
1375    2020-02-18 12:17:51.275000064+00:00  GO1
1376    2020-02-18 12:17:56.484999936+00:00  GO1
1377    2020-02-18 12:18:06.020000+00:00     GO1
1378    2020-02-18 12:18:10.922000128+00:00  NOGO
1379    2020-02-18 14:47:48.353999872+00:00  GO2
1380    2020-02-18 14:47:48.768000+00:00     GO2
1381    2020-02-18 14:48:03.120000+00:00     GO2

我正在尝试拆分数据框。也就是说,如果日期时间间隔不超过 15 秒,它们将被分组到一个新的数据帧中。

我的尝试是从 column 开始的check。该列显示其行上的值和后面的值是在 15 秒内 (GO) 还是超过 15 秒 (NOGO) 分开。

我在 GO 之后添加数字的原因是为了能够区分 GO 组。这是我的尝试代码:

databds = []
intervalo = pd.Timedelta(seconds = 15)
p = 0
for x in range(0,len(data)):
    for y in range(0,len(data[x])-1):     
        t = pd.to_datetime(data[x]['mintime'][y][0:19])
        tp1 = pd.to_datetime(data[x]['mintime'][y+1][0:19])
        resta = tp1 - t
        if resta > intervalo:
            data[x]['check'][y] = "NOGO"
            p = p + 1
        else:
            data[x]['check'][y] = "{}{}".format("GO", p)   
    for z in range(0,p):
        datito = data[x].loc[data[x]['check'] == "{}{}".format("GO", z)]
        databds.append(datito)

这个过程很长,而且对资源的要求很高。我相信必须有一种更简单的方法来做到这一点。我尝试过应用 pandas resample 但没有运气。

标签: pythonpandasdataframedatetimepandas-resample

解决方案


更新答案

  1. 通过将mintime列转换为日期时间pd.to_datetime

  2. 以秒为单位评估差异/用 0 填充 NAN 值并检查差异是否大于 15 秒。取 cumsum结果并使用groupby.

df.mintime = pd.to_datetime(df.mintime)
df_list = [g for k,g  in df.groupby((~(df.mintime.diff().dt.total_seconds().fillna(0) < 15)).cumsum())]

输出:

[                                 mintime check
 1375 2020-02-18 12:17:51.275000064+00:00   GO1
 1376 2020-02-18 12:17:56.484999936+00:00   GO1
 1377    2020-02-18 12:18:06.020000+00:00   GO1
 1378 2020-02-18 12:18:10.922000128+00:00  NOGO,
                                  mintime check
 1379 2020-02-18 14:47:48.353999872+00:00   GO2
 1380    2020-02-18 14:47:48.768000+00:00   GO2
 1381    2020-02-18 14:48:03.120000+00:00   GO2]

推荐阅读