Python 从一系列时间戳中提取月份的最快方法

Python 从一系列时间戳中提取月份的最快方法,python,pandas,Python,Pandas,我有非常大的熊猫数据框,大约7000万条记录,其中一个日期列包含熊猫的时间戳。我需要这些数据的月份和年份,但我发现提取这些数据的简单方法速度非常慢 下面是一个小例子,在我的机器上大约需要半秒钟。我的实际问题要大得多,时间戳的间隔也不均匀 ser = pd.Series(pd.date_range('1799-01-01','2100-12-01')) %timeit [x.month for x in ser] #1 loops, best of 3: 558 ms per loop 我希望

我有非常大的熊猫数据框,大约7000万条记录,其中一个日期列包含熊猫的时间戳。我需要这些数据的月份和年份,但我发现提取这些数据的简单方法速度非常慢

下面是一个小例子,在我的机器上大约需要半秒钟。我的实际问题要大得多,时间戳的间隔也不均匀

ser = pd.Series(pd.date_range('1799-01-01','2100-12-01'))

%timeit [x.month for x in ser]
#1 loops, best of 3: 558 ms per loop

我希望有一种方法可以转换成DateTimeIndex或其他能够快速提取月份和年份的东西,而这不会花费很长时间。

我不认为70mi记录应该保存在数据帧上。但好吧,我不能评判你的模特

在处理时间方面,我会将Datetime索引转换为时间历元值数组。那么你现在就可以用数字了。文档->


我相信这会加快操作速度,但是代码会变得不那么干净。

我不认为70mi记录应该保存在数据帧上。但好吧,我不能评判你的模特

在处理时间方面,我会将Datetime索引转换为时间历元值数组。那么你现在就可以用数字了。文档->

我相信这会使操作更快,但代码会更不干净。

您可以对类似datetime的系列使用访问器:

ser = pd.Series(pd.date_range('1799-01-01','2100-12-01'))
print ser.dt.month
# [ 1  1  1 ..., 11 11 12]
%timeit ser.dt.month
# 100 loops, best of 3: 14.7 ms per loop
手动循环方法:

%timeit [x.month for x in ser]
1 loops, best of 3: 389 ms per loop
您可以对类似datetime的系列使用访问器:

ser = pd.Series(pd.date_range('1799-01-01','2100-12-01'))
print ser.dt.month
# [ 1  1  1 ..., 11 11 12]
%timeit ser.dt.month
# 100 loops, best of 3: 14.7 ms per loop
手动循环方法:

%timeit [x.month for x in ser]
1 loops, best of 3: 389 ms per loop

我同意数据帧太大的说法:这是我需要快速而肮脏的修复的时候之一,但我在快速修复的同时却得到了很多肮脏的东西。这比应该的更常见。。。好吧,如果时间是你真正关心的问题,我也可以建议你搬到C。。。按照我的建议做,你注意到有什么有效的区别吗?我同意数据帧太大的说法:这是一个我需要快速而肮脏的修复,但在快速修复的同时却得到了很多肮脏的东西的时候。比它应该是更常见的。。。好吧,如果时间是你真正关心的问题,我也可以建议你搬到C。。。你注意到我推荐的有什么不同吗?很漂亮。非常感谢。美丽的非常感谢。