2016-03-04 3 views
0

У меня есть файл данных pandas с колонкой «StartTime», который может быть любым значением datetime. Я хотел бы создать второй столбец, который дает StartTime относительно начала недели (т. Е. 12 утра в предыдущее воскресенье). Например, этот пост составляет 5 дней, 14 часов с начала этой недели.Арифметика времени в серии pandas

   StartTime 
1 2007-01-19 15:59:24 
2 2007-03-01 04:16:08 
3 2006-11-08 20:47:14 
4 2008-09-06 23:57:35 
5 2007-02-17 18:57:32 
6 2006-12-09 12:30:49 
7 2006-11-11 11:21:34 

Я могу это сделать, но это довольно Данг медленно:

def time_since_week_beg(x): 
    y = x.to_datetime() 
    return pd.Timedelta(days=y.weekday(), 
         hours=y.hour, 
         minutes=y.minute, 
         seconds=y.second 
         ) 

df['dt'] = df.StartTime.apply(time_since_week_beg) 

То, что я хочу что-то вроде этого, что не приводит к ошибке:

df['dt'] = pd.Timedelta(days=df.StartTime.dt.dayofweek, 
         hours=df.StartTime.dt.hour, 
         minute=df.StartTime.dt.minute, 
         second=df.StartTime.dt.second 
      ) 

TypeError: Invalid type <class 'pandas.core.series.Series'>. Must be int or float. 

Любой мысли?

ответ

2

Вы можете использовать список понимание:

df['dt'] = [pd.Timedelta(days=ts.dayofweek, 
         hours=ts.hour, 
         minutes=ts.minute, 
         seconds=ts.second) 
      for ts in df.StartTime] 

>>> df 
      StartTime    dt 
0 2007-01-19 15:59:24 4 days 15:59:24 
1 2007-03-01 04:16:08 3 days 04:16:08 
2 2006-11-08 20:47:14 2 days 20:47:14 
3 2008-09-06 23:57:35 5 days 23:57:35 
4 2007-02-17 18:57:32 5 days 18:57:32 
5 2006-12-09 12:30:49 5 days 12:30:49 
6 2006-11-11 11:21:34 5 days 11:21:34 

В зависимости от формата StartTime, вам может понадобиться:

...for ts in pd.to_datetime(df.StartTime) 
+0

Это, безусловно, чище. Я не уверен, что это быстрее. В любом случае, вы можете думать о том, что может выполнять операции над серией? Не знаю, поможет ли это ускорить работу или нет. –

+0

Это, вероятно, не будет быстрее. 'df.StartTime.apply (lambda ts: pd.Timedelta (days = ts.dayofweek, hours = ts.hour, minutes = ts.minute, seconds = ts.second))' – Alexander

+1

На 100k строках тайминги практически идентичны. – Alexander

Смежные вопросы