'The volume field\'s aggregation returns the sum of all volumes
between the market open and the `dt`
If there has been no data on or before the `dt` the volume is 0.
Returns
np.array with dtype=int64, in order of assets parameter.'

def volumes(self, assets, dt):

    (market_open, prev_dt, dt_value, entries) = self._prelude(dt, 'volume')
    volumes = []
    session_label = self._trading_calendar.minute_to_session_label(dt)
    for asset in assets:
        if (not asset.is_alive_for_session(session_label)):
            volumes.append(0)
            continue
        if (prev_dt is None):
            val = self._minute_reader.get_value(asset, dt, 'volume')
            entries[asset] = (dt_value, val)
            volumes.append(val)
            continue
        else:
            try:
                (last_visited_dt, last_total) = entries[asset]
                if (last_visited_dt == dt_value):
                    volumes.append(last_total)
                    continue
                elif (last_visited_dt == prev_dt):
                    val = self._minute_reader.get_value(asset, dt, 'volume')
                    val += last_total
                    entries[asset] = (dt_value, val)
                    volumes.append(val)
                    continue
                else:
                    after_last = pd.Timestamp((last_visited_dt + self._one_min), tz='UTC')
                    window = self._minute_reader.load_raw_arrays(['volume'], after_last, dt, [asset])[0]
                    val = (np.nansum(window) + last_total)
                    entries[asset] = (dt_value, val)
                    volumes.append(val)
                    continue
            except KeyError:
                window = self._minute_reader.load_raw_arrays(['volume'], market_open, dt, [asset])[0]
                val = np.nansum(window)
                entries[asset] = (dt_value, val)
                volumes.append(val)
                continue
    return np.array(volumes)
