Pandas中针对日期时间列的向量化操作

5

我想将一个包含日期时间对象的列转换为一个整数列,该整数表示从该日期时间到今天的天数。我可以用一种丑陋的方法做到这一点,但我正在寻找一种更美观(而且更快)的方法。

假设我有一个带有日期时间列的数据框:

11    2014-03-04 17:16:26+00:00
12    2014-03-10 01:35:56+00:00
13    2014-03-15 02:35:51+00:00
14    2014-03-20 05:55:47+00:00
15    2014-03-26 04:56:33+00:00
Name: datetime, dtype: object

每个元素看起来都像:

datetime.datetime(2014, 3, 4, 17, 16, 26, tzinfo=<UTC>)

假设我想计算每个观察发生了多少天前,并将其作为一个简单的整数返回。我知道可以使用apply两次,但是否有一种向量化/更清晰的方式来实现呢?

today = datetime.datetime.today().date()
df_dates = df['datetime'].apply(lambda x: x.date())
days_ago = today - df_dates

这将返回一个timedelta64[ns]系列。

11   56 days, 00:00:00
12   50 days, 00:00:00
13   45 days, 00:00:00
14   40 days, 00:00:00
15   34 days, 00:00:00
Name: datetime, dtype: timedelta64[ns]

最后,如果我想要一个整数:

days_ago_as_int = days_ago.apply(lambda x: x.item().days)
days_ago_as_int
11    56
12    50
13    45
14    40
15    34
Name: datetime, dtype: int64

有什么想法吗?


相关问题没有完全回答我的问题:

Pandas Python-可以将日期时间与矢量化输入一起使用吗

Pandas将一天添加到列中


尝试Karl D的答案,我成功地得到了今天的日期和所需的日期列,但在减法时出现了问题(与原始示例中的不同日期时间,但这应该没有关系,对吧?):

converted_dates = df['date'].values.astype('datetime64[D]')
today_date = np.datetime64(dt.date.today())
print converted_dates
print today_date
print today_date - converted_dates

[2014-01-16 00:00:00 
2014-01-19 00:00:00 
2014-01-22 00:00:00
2014-01-26 00:00:00
2014-01-29 00:00:00]

2014-04-30 00:00:00

[16189 days, 0:08:20.637994
16189 days, 0:08:20.637991
16189 days, 0:08:20.637988
16189 days, 0:08:20.637984
16189 days, 0:08:20.637981]
1个回答

4

对于一个名为“date”的栏位,如何处理?

import datetime as dt
df['foo'] = (np.datetime64(dt.date.today()) 
             - df['date'].values.astype('datetime64[D]'))
print df

                 date     foo
0 2014-03-04 17:16:26 56 days
1 2014-03-10 01:35:56 50 days
2 2014-03-15 02:35:51 45 days
3 2014-03-20 05:55:47 40 days
4 2014-03-26 04:56:33 34 days

或者如果你希望将它作为一个整数:

df['foo'] = (np.datetime64(dt.date.today()) 
             - df['date'].values.astype('datetime64[D]')).astype(int)
print df
                  date  foo
0 2014-03-04 17:16:26   56
1 2014-03-10 01:35:56   50
2 2014-03-15 02:35:51   45
3 2014-03-20 05:55:47   40
4 2014-03-26 04:56:33   34

或者如果它是一个索引。
print np.datetime64(dt.date.today()) - df.index.values.astype('datetime64[D]')

[56 50 45 40 34]

较晚的编辑:如何通过此方法解决问题?
>>> print df

                 date
0 2014-03-04 17:16:26
1 2014-03-10 01:35:56
2 2014-03-15 02:35:51
3 2014-03-20 05:55:47
4 2014-03-26 04:56:33

尝试将今天的日期分配给一个列,以便 Pandas 将其转换为 datetime64 列,然后进行算术计算:
>>> df['today'] = dt.date.today()
>>> df['foo'] = (df['today'].values.astype('datetime64[D]')
               - df['date'].values.astype('datetime64[D]'))
>>> print df

                 date       today     foo
0 2014-03-04 17:16:26  2014-05-14 71 days
1 2014-03-10 01:35:56  2014-05-14 65 days
2 2014-03-15 02:35:51  2014-05-14 60 days
3 2014-03-20 05:55:47  2014-05-14 55 days
4 2014-03-26 04:56:33  2014-05-14 49 days

谢谢回答!但是对我来说实际上并没有完全奏效-- 我在我的提问中加入了我尝试遵循您的代码的部分。 - exp1orer
啊,converted_dates 是 datetime64[D] 类型, today_date 是 datetime64[us] 类型。有好的方法可以将 today_date 转换吗? - exp1orer
只是猜测,但也许可以使用np.datetime64(dt.date.today().strftime('%Y-%m-%d'))作为numpy 1.6的解决方法。 - Karl D.
顺便说一下...我现在正在使用numpy 1.8.1,但是仍然发生同样的事情。有任何想法吗? - exp1orer
你还是遇到 TypeError 错误吗?我不知道……我无法重现它。但我添加了一个可能的解决方法,能行吗? - Karl D.
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接