2016-03-04 90 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