2014-12-16 5 views

ответ

3

Для этого требуется 0.15.0 для функциональной функции Timedelta. Это будет иметь полную точность ваших дат.

In [19]: s 
Out[19]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2014-01-01 00:00:00, ..., 2014-01-02 12:00:00] 
Length: 4, Freq: 12H, Timezone: None 

In [21]: s-s[0] 
Out[21]: 
<class 'pandas.tseries.tdi.TimedeltaIndex'> 
['0 days 00:00:00', ..., '1 days 12:00:00'] 
Length: 4, Freq: None 

In [22]: ((s-s[0])/pd.Timedelta(1.0,unit='D')) + 1 
Out[22]: Float64Index([1.0, 1.5, 2.0, 2.5], dtype='float64') 

Деление на TimedeltaIndex с помощью Timedelta дает вам (флоат) фракции. Даты основаны на 0, поэтому мы добавляем обратно 1.

Вышеупомянутый «предполагает», что все даты указаны в том же году. Вот более надежный способ сделать это (вычитание datetimeindex в настоящее время не поддерживается напрямую)

In [53]: pd.TimedeltaIndex(s.asi8-s.to_period('A').to_timestamp().asi8) 
Out[53]: 
<class 'pandas.tseries.tdi.TimedeltaIndex'> 
['0 days 00:00:00', ..., '1 days 12:00:00'] 
Length: 4, Freq: None 
+0

Отлично работает, спасибо большое. Однако я не совсем уверен, что делать со вторым блоком кода. Это заменяет часть 's-s [0]'? –

+1

да, если хотите – Jeff

1

Я не уверен, если есть встроенные методы для достижения этой цели более аккуратно, но вы можете сделать:

dr = pd.date_range("2014-01-01 00:00", periods=4, freq="12H") 
dr.dayofyear + dr.hour/24.0 
Out[8]: array([ 1. , 1.5, 2. , 2.5]) 

К сожалению, при таком подходе, я думаю, вам придется создать достаточное количество терминов, чтобы добраться до точность, которую вы хотите, например включая минуты:

dr.dayofyear + dr.hour/24.0 + dr.minute/(24.0 * 60) 
Смежные вопросы