熊猫系列的时间算法

时间:2016-03-04 21:39:16

标签: python datetime pandas

我有一个带有“StartTime”列的pandas DataFrame,它可以是任何日期时间值。我想创建一个第二列,它将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.

有什么想法吗?

1 个答案:

答案 0 :(得分: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)