python - Pandas 日期时间列的矢量化操作

标签 python pandas

我想获取一列日期时间对象并返回一列整数,即“从该日期时间到今天的天数”。我可以用丑陋的方式来做,寻找更漂亮(更快)的方式。

假设我有一个带有日期时间列的数据框,如下所示:

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- can datetime be used with vectorized inputs

Pandas add one day to column


尝试 Karl D's answer ,我成功地获得了今天的日期和所需的日期列,但是在减法中出现了问题(与原始示例中的日期时间不同,但应该无关紧要,对吧?):

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]

最佳答案

(对于名为日期的列)怎么样?

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

关于python - Pandas 日期时间列的矢量化操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23378521/

相关文章:

python - pypi 依赖项中的 'extra' 是什么?

python - RubyPython::Python:Module 的未定义方法 `Py_IsInitialized'

python - 用 pandas 读取加密的 excel

python - 将 'season' 列添加到 NFL 比赛数据帧的理想方法是什么?

python - Pandas 比较多个列并将最长的字符串返回到新列

python - 尽管是分开的,但在更改另一个数组时意外更改了一个 numpy 数组

python - 无法在使用 Python 3.4.3 和 PostgreSQL 9.4.4 的 Windows 7 上安装 psycopg

python-2.7 - 将字符串列表转换为整数列表

python - 数据帧 : accumlate dates on week of day basis

python - 随机数文件编写器