The code below is the simplest way I found to "snap" a DateTimeIndex to some "frequency" (is there any better way?). I would have expected the to_period method to work as flexibly as the resample method that accepts any rule (like 15T, 2H, ...) but the to_period method does not appear to handle properly multiples of frequencies (and neither raises an exception).

Code Sample, a copy-pastable example if possible

import pandas
import datetime
dt=pandas.date_range('2016-01-01 00:00','2016-01-01 05:00',freq='15T',closed="left")
print(dt.to_period('H').start_time) # snap to the hour : OK
print(dt.to_period('2H').start_time) # snap to even hours : not OK

Actual Output

DatetimeIndex(['2016-01-01 00:00:00', '2016-01-01 00:00:00',
               '2016-01-01 00:00:00', '2016-01-01 00:00:00',
               '2016-01-01 01:00:00', '2016-01-01 01:00:00',
               '2016-01-01 01:00:00', '2016-01-01 01:00:00',
               '2016-01-01 02:00:00', '2016-01-01 02:00:00',
               '2016-01-01 02:00:00', '2016-01-01 02:00:00',
               '2016-01-01 03:00:00', '2016-01-01 03:00:00',
               '2016-01-01 03:00:00', '2016-01-01 03:00:00',
               '2016-01-01 04:00:00', '2016-01-01 04:00:00',
               '2016-01-01 04:00:00', '2016-01-01 04:00:00'],
              dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2016-01-01 00:00:00', '2016-01-01 00:00:00',
               '2016-01-01 00:00:00', '2016-01-01 00:00:00',
               '2016-01-01 01:00:00', '2016-01-01 01:00:00',
               '2016-01-01 01:00:00', '2016-01-01 01:00:00',
               '2016-01-01 02:00:00', '2016-01-01 02:00:00',
               '2016-01-01 02:00:00', '2016-01-01 02:00:00',
               '2016-01-01 03:00:00', '2016-01-01 03:00:00',
               '2016-01-01 03:00:00', '2016-01-01 03:00:00',
               '2016-01-01 04:00:00', '2016-01-01 04:00:00',
               '2016-01-01 04:00:00', '2016-01-01 04:00:00'],
              dtype='datetime64[ns]', freq=None)

Expected Output

DatetimeIndex(['2016-01-01 00:00:00', '2016-01-01 00:00:00',
               '2016-01-01 00:00:00', '2016-01-01 00:00:00',
               '2016-01-01 01:00:00', '2016-01-01 01:00:00',
               '2016-01-01 01:00:00', '2016-01-01 01:00:00',
               '2016-01-01 02:00:00', '2016-01-01 02:00:00',
               '2016-01-01 02:00:00', '2016-01-01 02:00:00',
               '2016-01-01 03:00:00', '2016-01-01 03:00:00',
               '2016-01-01 03:00:00', '2016-01-01 03:00:00',
               '2016-01-01 04:00:00', '2016-01-01 04:00:00',
               '2016-01-01 04:00:00', '2016-01-01 04:00:00'],
              dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2016-01-01 00:00:00', '2016-01-01 00:00:00',
               '2016-01-01 00:00:00', '2016-01-01 00:00:00',
               '2016-01-01 00:00:00', '2016-01-01 00:00:00',
               '2016-01-01 00:00:00', '2016-01-01 00:00:00',
               '2016-01-01 02:00:00', '2016-01-01 02:00:00',
               '2016-01-01 02:00:00', '2016-01-01 02:00:00',
               '2016-01-01 02:00:00', '2016-01-01 02:00:00',
               '2016-01-01 02:00:00', '2016-01-01 02:00:00',
               '2016-01-01 04:00:00', '2016-01-01 04:00:00',
               '2016-01-01 04:00:00', '2016-01-01 04:00:00'],
              dtype='datetime64[ns]', freq=None)

output of pd.show_versions()

INSTALLED VERSIONS

commit: None python: 3.5.2.final.0 python-bits: 32 OS: Windows OS-release: 7 machine: AMD64 processor: Intel64 Family 6 Model 61 Stepping 4, GenuineIntel byteorder: little LC_ALL: None LANG: None

pandas: 0.18.1 nose: None pip: 8.1.2 setuptools: 23.0.0 Cython: None numpy: 1.11.0 scipy: 0.17.1 statsmodels: None xarray: None IPython: 4.2.0 sphinx: None patsy: None dateutil: 2.5.3 pytz: 2016.4 blosc: None bottleneck: None tables: None numexpr: 2.6.1 matplotlib: 1.5.1 openpyxl: 2.3.2 xlrd: 1.0.0 xlwt: None xlsxwriter: 0.9.2 lxml: 3.6.0 bs4: None html5lib: None httplib2: 0.9.2 apiclient: None sqlalchemy: 1.0.12 pymysql: None psycopg2: 2.6.2 (dt dec pq3 ext) jinja2: 2.8 boto: None pandas_datareader: None

Comment From: jreback

I seem to recall that we have another issue about the same @sinhrks ?

Comment From: tdpetrou

I ran into a use-case for this today. I wanted to form periods based off the starting year of 10-year intervals.

Comment From: srgkoval

Still broken in v0.23.0

Comment From: jreback

@srgkoval hence the open tag

best way to get fixed is by submitting a PR

Comment From: JCCoynel

Just bumping this one to confirm this is still an issue in 1.3.4

I worked around this by using to_period('2H') instead