计数与时隙重叠的行

时间:2019-02-13 14:31:18

标签: python pandas numpy

这是我的问题:我有一个由三列组成的DataFrame esp(大约500万行),开始日期时间,结束日期时间和类别

    DHE                 DHS                 CAT  
0   2017-01-08 13:28:20 2017-01-08 13:43:13 43  
1   2017-01-08 13:43:50 2017-01-08 13:45:39 43  
2   2017-01-08 13:43:57 2017-01-08 13:46:18 43  
3   2017-01-08 13:44:03 2017-01-08 13:46:32 43  
4   2017-01-08 13:44:24 2017-01-08 13:53:29 43  
DHE    datetime64[ns]
DHS    datetime64[ns]
CAT             int64
dtype: object

我有第二个DataFrame ts(大约一百万行),由一分钟的时隙和每个类别的一列组成

ts = pd.DataFrame(data={str(i): 0 for i in np.sort(esp['CAT'].unique())},
              index = pd.date_range(min(min(esp['DHE']), min(esp['DHS'])), 
                                     (max(max(esp['DHE']), max(esp['DHS'])) + pd.Timedelta(days=1)), 
                                     freq='min', 
                                     normalize=True))

                    41  42  43  45  46  47  48  50  52  53  54  55
2016-01-10 00:00:00 0   0   0   0   0   0   0   0   0   0   0   0
2016-01-10 00:01:00 0   0   0   0   0   0   0   0   0   0   0   0
2016-01-10 00:02:00 0   0   0   0   0   0   0   0   0   0   0   0
2016-01-10 00:03:00 0   0   0   0   0   0   0   0   0   0   0   0
2016-01-10 00:04:00 0   0   0   0   0   0   0   0   0   0   0   0
dtype('<M8[ns]')
41    int64
42    int64
43    int64
45    int64
46    int64
47    int64
48    int64
50    int64
52    int64
53    int64
54    int64
55    int64
dtype: object

我想在第二个DataFrame ts中对所有时隙进行计数,按已开始但尚未结束的esp事件数量进行分类。
因此,我正在做的是这样:

for index, row in esp.iterrows():
    ts.loc[row['DHE'].floor('min'):row['DHS'].ceil('min'), str(row['CAT'])] += 1

但是,它很长,因为我还没有找到绕过for循环使用的解决方案。 您能帮我找到一种获得想要的结果的方法吗(例如使用numpy的矢量化功能?)?

0 个答案:

没有答案