2014-11-20 13 views
6

Chcę utworzyć DateTimeIndex w odstępach 1-minutowych w oparciu o znacznik czasu rozpoczęcia i zakończenia (podane w mikrosekundach od epoki) z pd_date_range(). Aby to zrobić, muszę zaokrąglić początkowy znacznik czasu w górę i końcowy znacznik czasu w dół. Oto co mam do tej pory:Znacznik czasu zaokrąglania pand do minut

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') 

Chcę zaokrąglić:

start_ts do Timestamp('2014-07-28 00:32') i

end_ts do Timestamp('2014-07-28 08:14').

Jak mogę to zrobić?

+0

jakich wyników oczekujesz? –

Odpowiedz

5

Robi to w prosty sposób jest obecnie wybitny problem here

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 

Mimo jego dość proste.

Żądania wyciągnięcia do wdrożenia są mile widziane.

+1

Wygląda na to, że Jeff zajął się tą implementacją, nadchodząc v0.18.0: https://github.com/pydata/pandas/pull/11690 Dzięki! –

0
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') 
4

Miałem podobny problem, chcąc zaokrąglić do dnia. Okazuje się, że jest łatwy sposób (działa dla Y [ucho] M [miesiąc] D [ay], h [nasz], m [inute], s [econd]). Zakładając, DF jest DataFrame pandy w kolumnie 'datecol':

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

będzie zaokrąglenia do inute [m]. Biorąc pod uwagę, że znalazłem to pytanie początkowo myślałem, że odwołuje się do tyłu odpowiedź dostałem, jak się wydaje istotne,

More efficient way to round to day timestamps using pandas

1

Jako @ user3735204 stwierdził, że jest możliwe, aby zaokrąglić kolumny z:

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

gdzie jednostka w nawiasach kwadratowych mogą być:

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

możliwe jest również, aby zaokrąglić do najbliższej (reference) poprzez kolumnę jako wskaźnika i stosowania okrągły sposób (podane na pand 0.19.0):

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

przykład:

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) 
12

W wersji 0.18 pandy ma wbudowany -W datetime-like rounding functionality:

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

można również użyć .ceil lub .floor, jeśli chcesz wymusić zaokrąglenie w górę lub w dół.

+1

OMG! Działa jak urok! Ale musisz użyć akcesora "dt". df.ts.dt.round ('5 min') – Andor

+0

Bardzo ładne, dziękuję! – onkel