如何计算特定时间范围内的时间

时间:2019-05-16 05:50:49

标签: python python-3.x pandas

我在给定时间间隔内计算时间时遇到问题。我只想计算连续的分钟数,例如5分钟。例如,我们不计算19:46-19:51是之间的时间。

第一个想法是,如果没有中断的时间间隔长度,则将值添加到数组中。

2019-05-14 19:26:00,144.1639344262295
2019-05-14 19:27:00,138.54098360655738
2019-05-14 19:46:00,137.45901639344262
2019-05-14 19:47:00,139.24590163934425
2019-05-14 19:49:00,161.0
2019-05-14 19:50:00,145.90322580645162
2019-05-14 19:51:00,145.327868852459
2019-05-14 20:18:00,150.95081967213116
2019-05-14 20:19:00,155.80645161290323
2019-05-14 20:20:00,155.5737704918033
2019-05-14 20:21:00,155.0327868852459
2019-05-14 20:22:00,157.70491803278688
2019-05-14 20:23:00,156.5483870967742
2019-05-14 20:24:00,155.62295081967213
2019-05-14 20:25:00,156.1451612903226
2019-05-14 20:26:00,152.65
2019-05-14 20:27:00,157.8548387096774
2019-05-14 20:28:00,156.01639344262296
2019-05-14 20:29:00,156.6290322580645
2019-05-14 20:30:00,156.44262295081967

预期结果:20:18至20:30之间的13分钟时间。

您是否知道如何做这样的事情?

2 个答案:

答案 0 :(得分:1)

通过值Series.diff求和,并通过与Series.ne比较不等于Series.cumsum来创建组:

#if DatetimeIndex
g = df.index.to_series().diff().ne(pd.Timedelta('1Min')).cumsum()
#if column dates
g = df['dates'].diff().ne(pd.Timedelta('1Min')).cumsum() 

然后可以使用Series.mapSeries.value_counts进行计数,比较更大的值和仅sum的{​​{1}}值:

True

如果需要过滤器行,请使用boolean indexing

out = g.map(g.value_counts()).gt(5).sum()
print (out)
13

如果需要在新的df1 = df[g.map(g.value_counts()).gt(5)] print (df1) a 2019-05-14 20:18:00 150.950820 2019-05-14 20:19:00 155.806452 2019-05-14 20:20:00 155.573770 2019-05-14 20:21:00 155.032787 2019-05-14 20:22:00 157.704918 2019-05-14 20:23:00 156.548387 2019-05-14 20:24:00 155.622951 2019-05-14 20:25:00 156.145161 2019-05-14 20:26:00 152.650000 2019-05-14 20:27:00 157.854839 2019-05-14 20:28:00 156.016393 2019-05-14 20:29:00 156.629032 2019-05-14 20:30:00 156.442623 中输出,则可以汇总GroupBy.firstGroupBy.last并按GroupBy.size计数:

DataFrame

答案 1 :(得分:0)

尝试:

blocks = df[0].diff().dt.seconds.ne(60).cumsum()
blocks.groupby(blocks).apply(lambda x: len(x) if len(x)>=5 else 0).sum()
# 13

如果您想要实际的块:

df['block'] = df[0].diff().dt.seconds.ne(60).cumsum()
df.groupby('block').apply(lambda x: x if len(x) >=5 else None).dropna()

输出:

    0                       1           block
7   2019-05-14 20:18:00     150.950820  4.0
8   2019-05-14 20:19:00     155.806452  4.0
9   2019-05-14 20:20:00     155.573770  4.0
10  2019-05-14 20:21:00     155.032787  4.0
11  2019-05-14 20:22:00     157.704918  4.0
12  2019-05-14 20:23:00     156.548387  4.0
13  2019-05-14 20:24:00     155.622951  4.0
14  2019-05-14 20:25:00     156.145161  4.0
15  2019-05-14 20:26:00     152.650000  4.0
16  2019-05-14 20:27:00     157.854839  4.0
17  2019-05-14 20:28:00     156.016393  4.0
18  2019-05-14 20:29:00     156.629032  4.0
19  2019-05-14 20:30:00     156.442623  4.0