REF: use _constructor and ABCFoo to avoid runtime imports
- [ ] closes #xxxx
- [ ] tests added / passed
- [ ] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

thanks! A question in general: why do we find run-time imports (within function imports) problematic?

Further concrete note: using `_constructor` has consequences, as this property is explicitly for subclass handling. So using it in eg `pd.to_datetime` means that this function will start returning subclasses if a subclass is passed. And I am not sure we actually want this. > A question in general: why do we find run-time imports (within function imports) problematic?

A pattern I re-discovered when making a PR to cython a couple weeks ago: runtime imports mean circular dependencies, which make the codebase _much_ harder for newcomers to understand.
 it’s not just that I think I saw this on the arrow mailing list recently: 
https://github.com/apache/arrow/pull/3706#issuecomment-465558284

importing an already imported module in python is pretty cheap but apparently is not very cheap in cython https://github.com/cython/cython/issues/2854 > runtime imports mean circular dependencies, which make the codebase _much_ harder for newcomers to understand.

I would argue for the opposite .. :) Runtime import (eg the Series import in `to_datetime`) is perfectly understandable python code, while the ABCSeries is something very pandas specific that most newcomers will not know.

> importing an already imported module in python is pretty cheap but apparently is not very cheap in cython

OK, that might certainly something to take care of, but here we are speaking about pure python submodules?

---

In any case, I think `to_datetime`/`to_timedelta` change is something we might want to revert (I don't think we want to commit to the behaviour it is preserving a subclass?). The `isna` is a bit less clear (it is used for a method on a Series, so there is also something to say to keep the subclass type)