Pandas 日期时间列到序数

问题描述 投票:0回答:4

我正在尝试创建一个新的 Pandas 数据框列,其中包含日期时间列中的序号:

import pandas as pd
from datetime import datetime

print df.ix[0:5]
                              date
file                              
gom3_197801.nc 2011-02-16 00:00:00
gom3_197802.nc 2011-02-16 00:00:00
gom3_197803.nc 2011-02-15 00:00:00
gom3_197804.nc 2011-02-17 00:00:00
gom3_197805.nc 2011-11-14 00:00:00

df['date'][0].toordinal()

Out[6]:
734184

df['date'].toordinal()

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-dbfd5e8b60f0> in <module>()
----> 1 df['date'].toordinal()

AttributeError: 'Series' object has no attribute 'toordinal'

我想这是一个基本问题,但过去 30 分钟我一直在努力阅读文档。

如何为我的数据框创建序数时间列?

python datetime pandas
4个回答
29
投票

使用应用:

df['date'].apply(lambda x: x.toordinal())

12
投票

您还可以使用

map
:

import datetime as dt
df['date'].map(dt.datetime.toordinal)

3
投票

为了完整性:
申请

pd.Timestamp.toordinal

df['date'].apply(pd.Timestamp.toordinal)

0
投票

速度提高 2 倍的方法

我讨厌不得不求助于

apply
map
所以这里有一个更有效的方法(在我的例子中大约快 2 倍)。它使用
np.vectorize

import pandas as pd
import numpy as np

def to_ordinal(dt):
  return dt.toordinal()

vectorized_ordinal = np.vectorize(to_ordinal, otypes=['int'])
df = pd.DataFrame()
df['date'] = pd.date_range('2000-01-01', '2030-01-01', freq='d')
df['ordinal_date'] = vectorized_ordinal(dates)

使用应用

%timeit df['date'].apply(pd.Timestamp.toordinal)

每次循环 11.2 ms ± 429 µs(7 次运行的平均值 ± 标准偏差,每次 100 个循环)

使用

np.vectorize
%timeit vectorized_ordinal(df['date'])

每次循环 5.89 ms ± 447 µs(7 次运行的平均值 ± 标准偏差,每次 100 个循环)

© www.soinside.com 2019 - 2024. All rights reserved.