我在给定时间间隔内计算时间时遇到问题。我只想计算连续的分钟数,例如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分钟时间。
您是否知道如何做这样的事情?
答案 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.map
和Series.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.first
,GroupBy.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