在pandas中对datetime列进行矢量化操作
我想要把一列日期时间对象转换成一列整数,这些整数表示“从那个日期时间到今天的天数”。我可以用一种比较笨的方法做到这一点,但我想找一种更好(也更快)的方法。
假设我有一个数据表,其中有一列日期时间,像这样:
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 - 日期时间能否与向量化输入一起使用
尝试了 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