2015-11-17 2 views
1

У меня есть дата начала и массив, содержащий нерегулярные значения выборки в днях, которые я хотел бы использовать в качестве индекса даты для серии pandas.суммирование временных меток pandas и массива, содержащих значения timedelta

Как:

In [233]: date = pd.Timestamp('2015-10-17 08:00:00') 
Out[233]: Timestamp('2015-10-17 08:00:00') 

In [234]: sample_size = np.array([0,10,13,19,30]) 
Out[234]: array([ 0., 16., 32., 48., 64.]) 

Теперь я мог бы использовать список и следующий цикл для создания серии панды DATETIME:

In [235]: all_dates = [] 
      for stepsize in sample_size: 
       days = pd.Timedelta(stepsize, 'D') 
       all_dates.append(date + days) 
      pd.Series(all_dates) 
Out[235]: 2015-10-17 08:00:00 
      2015-10-27 08:00:00 
      2015-10-30 08:00:00 
      2015-11-05 08:00:00 
      2015-11-16 08:00:00 
      dtype: datetime64[ns] 

Но я надеялся на чисто NumPy или панд решение без необходимости перечня и для петли

ответ

1
In [11]: 
pd.Series(pd.TimedeltaIndex(sample_size , unit = 'D') + date) 
Out[11]: 
0 2015-10-17 08:00:00 
1 2015-10-27 08:00:00 
2 2015-10-30 08:00:00 
3 2015-11-05 08:00:00 
4 2015-11-16 08:00:00 
dtype: datetime64[ns] 

Сначала вам необходимо создать временную дельту al л значения, которые вы хотите добавить к вашей дате, обратите внимание, что я назначен D в качестве параметра, который означает, что мы должны частоту время дельты быть в дни, потому что мы хотим, чтобы добавить дней к нашей дате

In [42]: 
time_delta = pd.TimedeltaIndex(sample_size, unit = 'D') 
time_delta 
Out[42]: 
TimedeltaIndex(['0 days', '10 days', '13 days', '19 days', '30 days'], dtype='timedelta64[ns]', freq=None) 

затем в чтобы добавить свое дельта времени к вашей дате, вам нужно выполнить два условия: сначала вам нужно создать timeseries вашей даты, чтобы позже вы могли добавить к нему временную дельта, во-вторых, недавно созданный timeseries должен иметь одинаковые количество элементов вашего timedelta, что может быть достигнуто на repeat(len(sample_size)

In [40]: 
time_stamp = pd.Series(np.array(date).repeat(len(sample_size))) 
time_stamp 
Out[40]: 
0 2015-10-17 08:00:00 
1 2015-10-17 08:00:00 
2 2015-10-17 08:00:00 
3 2015-10-17 08:00:00 
4 2015-10-17 08:00:00 
dtype: datetime64[ns] 

In [41]: 
time_stamp + time_delta 
Out[41]: 
0 2015-10-17 08:00:00 
1 2015-10-27 08:00:00 
2 2015-10-30 08:00:00 
3 2015-11-05 08:00:00 
4 2015-11-16 08:00:00 
dtype: datetime64[ns] 
+0

, который, похоже, работает, поэтому сначала нужно создать серию, равную 'date' и с длиной' sample_size'. Все еще немного громоздко, хотя – Mattijn

+0

Я добавил некоторые объяснения, чтобы подробнее рассказать о том, как это решение работает –

+1

вам не нужно вручную транслировать, просто добавить их, и он будет работать '' Series (pd.to_timedelta (sample_size, unit = 'D ') + дата) '' – Jeff