我正在尝试创建一个新的 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 分钟我一直在努力阅读文档。
如何为我的数据框创建序数时间列?
使用应用:
df['date'].apply(lambda x: x.toordinal())
您还可以使用
map
:
import datetime as dt
df['date'].map(dt.datetime.toordinal)
为了完整性:
申请
pd.Timestamp.toordinal
df['date'].apply(pd.Timestamp.toordinal)
我讨厌不得不求助于
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 个循环)