Округление Pandas Timestamp до минут

Я хочу создать DateTimeIndex с интервалами в 1 минуту на основе начальной и конечной отметок времени (дается в микросекундах с начала эпохи) с pd_date_range(), Для этого мне нужно округлить начальную метку времени вверх и конечную метку времени вниз. Вот что у меня так далеко:

import pandas as pd
start = 1406507532491431
end = 1406535228420914

start_ts = pd.to_datetime(start, unit='us') # Timestamp('2014-07-28 00:32:12.491431')
end_ts = pd.to_datetime(end, unit='us') # Timestamp('2014-07-28 08:13:48.420914')

Я хочу округлить:

start_ts в Timestamp('2014-07-28 00:32') а также

end_ts в Timestamp('2014-07-28 08:14'),

Как я могу это сделать?

6 ответов

Решение

Делать это простым способом - в настоящее время нерешенная проблема здесь

In [22]: start = 1406507532491431

In [23]: end = 1406535228420914

[26]: dti = pd.to_datetime([start,end],unit='us')

In [27]: dti
Out[27]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-07-28 00:32:12.491431, 2014-07-28 08:13:48.420914]
Length: 2, Freq: None, Timezone: None

In [29]: pd.DatetimeIndex(((dti.asi8/(1e9*60)).round()*1e9*60).astype(np.int64))
Out[29]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-07-28 00:32:00, 2014-07-28 08:14:00]
Length: 2, Freq: None, Timezone: None

Тем не менее, это довольно просто.

Pull-запросы для реализации приветствуются.

Начиная с версии 0.18, Pandas имеет встроенную функцию округления по дате и времени:

start_ts.round('min')  # Timestamp('2014-07-28 00:32:00')
end_ts.round('min')    # Timestamp('2014-07-28 08:14:00')

Вы также можете использовать .ceil или же .floor если вам нужно форсировать округление вверх или вниз.


РЕДАКТИРОВАТЬ: приведенный выше код работает с raw pd.Timestamp по просьбе ОП. Если вы работаете с pd.Series, использовать dt сбруя:

s = pd.Series(pd.to_datetime([1406507532491431000, 1406535228420914000]))
s.dt.round('min')

Выход:

0   2014-07-28 00:32:00
1   2014-07-28 08:14:00
dtype: datetime64[ns]

У меня была похожая проблема, желая завершить день. Оказывается, есть простой способ (он работает для Y[ear] M[month] D[ay], h[our], m[inute], s[econd]). Предполагая, что df - это DataFrame от pandas со столбцом datecol:

df['datecol'] = df['datecol'].values.astype('<M8[m]')

Округлит его до м инуте. Учитывая, что я нашел этот вопрос изначально, я решил связать ответ, который я получил, так как он кажется уместным,

Более эффективный способ округлять дневные метки времени с помощью панд

Как указано @user3735204, столбцы можно округлить с помощью:

df['datecol'] = df['datecol'].astype('datetime64[m]')

где единица в квадратных скобках может быть:

Y[ear] M[month] D[ay], h[our], m[inute], s[econd]

Также возможно округлить до ближайшего ( ссылка), сделав столбец в качестве индекса и применив метод округления (доступно в pandas 0.19.0):

df.index = pd.to_datetime(df['datecol'])
df.index = df.index.round("S")

Пример:

df = pd.DataFrame(data = tmpdata)
df['datecol'] = df['datecol'].astype('datetime64[s]')
print df['datecol']

0   2016-10-05 05:37:42
1   2016-10-05 05:37:43
Name: datecol, dtype: datetime64[ns]

df.index = pd.to_datetime(df['datecol'])
df.index = df.index.round("S")

print df.index

DatetimeIndex(['2016-10-05 05:37:43', '2016-10-05 05:37:43'], dtype='datetime64[ns]', name=u'timestamp', freq=None)

data.index.round('60S')

всего около 60 секунд.

import pandas as pd
new_index = pd.date_range(start=start_ts.strftime('%Y-%m-%d %H:%M'), end=end_ts.strftime('%Y-%m-%d %H:%M'), freq='1min')
Другие вопросы по тегам