2016-03-04 77 views
0

我有一个熊猫DataFrame的列“StartTime”,可以是任何日期时间值。我想创建第二个列,使StartTime相对于一周的开始(即上一个星期日的上午12点)。例如,这篇文章是自本周开始以来的5天,14小时。熊猫系列的时间算术

   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