REF: Separate timezone-conversion from tslibs.conversion
State: closed

Two motivations:

1) #25853 re-implements some tz-conversion code in order to avoid circular imports.  By separating out this tightly-scoped, low-dependency chunk of code, we can avoid both duplication and circularity.
2) there has been scope-creep in `tslibs.conversion` which was originally intended for functions converting between datetime-like objects, but has picked up a bunch of timezone-conversion functions (separated by this PR) and normalization functions (not affected by this PR)

Labels:
name: Timezones
description: Timezone data dtype
name: Clean

Comments:
# [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=h1) Report
> Merging [#25938](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=desc) into [master](https://codecov.io/gh/pandas-dev/pandas/commit/de3a85c8404505ace0c0febc26b1fbe824f48034?src=pr&el=desc) will **decrease** coverage by `<.01%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/pandas-dev/pandas/pull/25938/graphs/tree.svg?width=650&token=eZ4WkYLtcO&height=150&src=pr)](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master   #25938      +/-   ##
==========================================
- Coverage   91.81%   91.81%   -0.01%     
==========================================
  Files         175      175              
  Lines       52580    52581       +1     
==========================================
- Hits        48278    48275       -3     
- Misses       4302     4306       +4
```

| Flag | Coverage Δ | |
|---|---|---|
| #multiple | `90.36% <100%> (ø)` | :arrow_up: |
| #single | `41.9% <100%> (-0.08%)` | :arrow_down: |

| [Impacted Files](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pandas/\_libs/tslibs/\_\_init\_\_.py](https://codecov.io/gh/pandas-dev/pandas/pull/25938/diff?src=pr&el=tree#diff-cGFuZGFzL19saWJzL3RzbGlicy9fX2luaXRfXy5weQ==) | `100% <100%> (ø)` | :arrow_up: |
| [pandas/io/gbq.py](https://codecov.io/gh/pandas-dev/pandas/pull/25938/diff?src=pr&el=tree#diff-cGFuZGFzL2lvL2dicS5weQ==) | `75% <0%> (-12.5%)` | :arrow_down: |
| [pandas/core/frame.py](https://codecov.io/gh/pandas-dev/pandas/pull/25938/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvZnJhbWUucHk=) | `96.79% <0%> (-0.12%)` | :arrow_down: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=footer). Last update [de3a85c...ecb7342](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

# [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=h1) Report
> :exclamation: No coverage uploaded for pull request base (`master@9fbb9e7`). [Click here to learn what that means](https://docs.codecov.io/docs/error-reference#section-missing-base-commit).
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/pandas-dev/pandas/pull/25938/graphs/tree.svg?width=650&token=eZ4WkYLtcO&height=150&src=pr)](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=tree)

```diff
@@            Coverage Diff            @@
##             master   #25938   +/-   ##
=========================================
  Coverage          ?   91.81%           
=========================================
  Files             ?      175           
  Lines             ?    52581           
  Branches          ?        0           
=========================================
  Hits              ?    48275           
  Misses            ?     4306           
  Partials          ?        0
```

| Flag | Coverage Δ | |
|---|---|---|
| #multiple | `90.36% <100%> (?)` | |
| #single | `41.9% <100%> (?)` | |

| [Impacted Files](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pandas/\_libs/tslibs/\_\_init\_\_.py](https://codecov.io/gh/pandas-dev/pandas/pull/25938/diff?src=pr&el=tree#diff-cGFuZGFzL19saWJzL3RzbGlicy9fX2luaXRfXy5weQ==) | `100% <100%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=footer). Last update [9fbb9e7...fefcd23](https://codecov.io/gh/pandas-dev/pandas/pull/25938?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

lgtm. can you merge master. also if you can re-check the doc-strings of the modules (conversion &  tzconversion) to make sure they are appropriate. ping on green.
can you merge master
thanks @jbrockmendel