Issue 1:
When try to access labels (.loc) by using a specific list of Timestamp objects or a DatetimeIndex object (See attached csv file), the resulting index is returned in UTC offset but the original timezone is not removed.

This seems to happen only in very specific cases, when the index passed to .loc contains labels that do not exist in the DataFrame and also contains duplicates.

@yuval-jether

import pandas as pd
import pytz
idx = pd.date_range('2011-01-01', '2017-10-01 00:00:00', freq='h', tz='America/Chicago')
s = pd.Series(np.random.rand(len(idx)), index=idx)
i = pd.to_datetime(['2017-09-30 06:00:00', '2017-09-30 23:00:00', '2017-09-30 23:00:00', '2017-10-01 00:00:00',]).tz_localize('America/Chicago')
s.loc[i]

Out[39]:
2017-09-30 06:00:00-05:00 0.380138
2017-09-30 23:00:00-05:00 0.774696
2017-09-30 23:00:00-05:00 0.774696
2017-10-01 00:00:00-05:00 0.728027
dtype: float64

# Added a label that does not exist in the Series
import pandas as pd
import pytz
idx = pd.date_range('2011-01-01', '2017-10-01 00:00:00', freq='h', tz='America/Chicago')
s = pd.Series(np.random.rand(len(idx)), index=idx)
i = pd.to_datetime(['2017-09-30 06:00:00', '2017-09-30 23:00:00', '2017-09-30 23:00:00', '2017-10-01 00:00:00', '2017-10-01 01:00:00',]).tz_localize('America/Chicago')
s.loc[i]

Out[40]:
2017-09-30 11:00:00-05:00 0.645350
2017-10-01 04:00:00-05:00 0.099323
2017-10-01 04:00:00-05:00 0.099323
2017-10-01 05:00:00-05:00 0.037136
2017-10-01 06:00:00-05:00 NaN
dtype: float64

Output of pd.show_versions()

pd.show_versions()

2017-10-30 03:15:08 [pip.utils] [DEBUG] lzma module is not available

2017-10-30 03:15:08 [pip.vcs] [DEBUG] Registered VCS backend: git

2017-10-30 03:15:08 [pip.vcs] [DEBUG] Registered VCS backend: hg

2017-10-30 03:15:08 [pip.pep425tags] [DEBUG] Config variable 'Py_DEBUG' is unset, Python ABI tag may be incorrect

2017-10-30 03:15:08 [pip.pep425tags] [DEBUG] Config variable 'WITH_PYMALLOC' is unset, Python ABI tag may be incorrect

2017-10-30 03:15:08 [pip.pep425tags] [DEBUG] Config variable 'Py_UNICODE_SIZE' is unset, Python ABI tag may be incorrect

2017-10-30 03:15:08 [pip.pep425tags] [DEBUG] Config variable 'Py_DEBUG' is unset, Python ABI tag may be incorrect

2017-10-30 03:15:08 [pip.pep425tags] [DEBUG] Config variable 'WITH_PYMALLOC' is unset, Python ABI tag may be incorrect

2017-10-30 03:15:08 [pip.pep425tags] [DEBUG] Config variable 'Py_UNICODE_SIZE' is unset, Python ABI tag may be incorrect

2017-10-30 03:15:08 [pip.vcs] [DEBUG] Registered VCS backend: svn

2017-10-30 03:15:09 [pip.vcs] [DEBUG] Registered VCS backend: bzr

INSTALLED VERSIONS

commit: None

python: 2.7.12.final.0

python-bits: 64

OS: Windows

OS-release: 8.1

machine: AMD64

processor: Intel64 Family 6 Model 60 Stepping 3, GenuineIntel

byteorder: little

LC_ALL: None

LANG: None

LOCALE: None.None

pandas: 0.20.3

pytest: 3.0.7

pip: 9.0.1

setuptools: 36.5.0

Cython: None

numpy: 1.13.1

scipy: 0.18.1

xarray: 0.9.6

IPython: 5.5.0

sphinx: None

patsy: 0.4.1

dateutil: 2.6.1

pytz: 2017.2

blosc: None

bottleneck: None

tables: None

numexpr: 2.6.2

feather: None

matplotlib: 2.0.2

openpyxl: 2.4.8

xlrd: 1.0.0

xlwt: 1.2.0

xlsxwriter: None

lxml: 3.8.0

bs4: 4.5.1

html5lib: 0.999999999

sqlalchemy: None

pymysql: None

psycopg2: None

jinja2: 2.9.6

s3fs: None

pandas_gbq: None

pandas_datareader: 0.4.0

Issue 2:
Perhaps there is some canonical way of doing this that I'm not aware of, but from time to time I find myself wanting to group more than one frame by a key, and apply some function to the result. At the moment, I'm doing this in a somewhat roundabout way:

results = []
for key, t1 in table1.groupby(level='id'):
try:
t2 = table2.xs(key, level='id')
except KeyError:
t2 = None
try:
t3 = table3.xs(key, level='id')
except KeyError:
t3 = None
# ... etc
r = some_func(t1, t2, t3)
results.append(r)
results = pd.concat(results)

I realize that often the easiest thing to do is just to merge the frames, but there are cases where that doesn't really make sense (e.g. non-compatible multiindexes that share one level). I imagine pd.merge(t1, t2, on="id") already does something like this to line up tables - do you guys think there is any value in exposing a standard way of doing this? Perhaps something like:

pd.multi_frame_groupby([t1, t2, t3, t4], level='id').apply(some_func)

Or, given that the full behaviour of such a groupby object is non trivial, perhaps just a generator for frame tuples?

gen = pd.multi_frame_groupby([t1, t2, t3, t4], level='id')
pd.concat([some_func(*t) for t in gen])