Rats, I made a comment an hour ago but apparently forgot to hit the Comment on this line button.  OK, again:

You can make this part more robust by doing the `try` on exactly the code you are testing and nothing more:
```
try:
    val0 = val[0]
except:
    isiterable_of_times = False
else:
    isiterable_of_times = isinstance(val0, self.__class__)
```
By using a bare except then you don't make any assumptions about how `val[0]` might fail.  Who knows, it could be a user object that throws `ValueError` in this case, but if evaluating `val[0]` fails for any reason then it clearly is not a list of Time objects.

I learned a lesson here because I knew the `__getitem__` might not work in some cases, but I thought they would be weird corner cases that we could safely ignore.  Not.