After some more thought, while I do agree that the chunk_handler needs to define this, I think it should depend (somewhat) on the underlying Array type of the Aggregation instance
  -- e.g. what about float32, complex
The calculation can also complain about unreasonable underlying types
  -- e.g. (for means) string, object 

I think the dtype is *fixed* for a given Aggregation instance, so it would be better calculated just once in the constructor, by calling the chunk_handler method (which logically can now also be a class method, so you don't need to create a chunk_handler instance to do it).

So I'd suggest that:  Aggregation.\__init__ sets ```self._dtype = chunk_handler_class.dtype(array.dtype)```, then Aggregation.dtype can be just a readonly property returning self.\_dtype.
That would avoid creating a new chunk_handler every time you're asked for Aggregation.dtype, which it currently does.