Python 使pd.to_datetime()更快
我有一个关于熊猫的问题: 我有300万行的大日期,其中一列“时间”的格式为:'%m/%d/%Y%H%m'(例如,2021年2月28日0:00)。 当我尝试对此运行pd.to_datetime()并指定格式时,大约需要7秒。 太长了 我尝试了以下操作:获取日期的所有唯一值(drop_duplicates(),大约800个唯一值),然后使用“repeat”从中重新创建一个约300万行的数据帧。当我这样做的时候:Python 使pd.to_datetime()更快,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个关于熊猫的问题: 我有300万行的大日期,其中一列“时间”的格式为:'%m/%d/%Y%H%m'(例如,2021年2月28日0:00)。 当我尝试对此运行pd.to_datetime()并指定格式时,大约需要7秒。 太长了 我尝试了以下操作:获取日期的所有唯一值(drop_duplicates(),大约800个唯一值),然后使用“repeat”从中重新创建一个约300万行的数据帧。当我这样做的时候: no_duplicates = initial_df['Time'].drop_dupl
no_duplicates = initial_df['Time'].drop_duplicates()
no_duplicates = no_duplicates.repeat(4000) #approx. 3 million rows
df = pd.DataFrame({'Timestamp' : no_duplicates})
pd.to_datetime(df.Timestamp, format = '%m/%d/%Y %H%M')
只花了254毫秒
我最初认为这是因为“repeat”正在执行某些操作(因此更改1将更改所有类似的行),但事实并非如此(为了检查,我将dataframe no_duplicates导出到csv并重新导入,仍然在254毫秒内运行)。
令我惊讶的是,跑步时:
df = pd.DataFrame({'Timestamp' : no_duplicates.sample(frac=1).reset_index(drop=True)}) #reshuffling the rows
pd.to_datetime(df.Timestamp, format = '%m/%d/%Y %H%M')
这又花了7秒钟
因此,行的顺序似乎有影响。为什么呢?如何将初始数据帧中具有相同日期的所有行分组并使它们连续(或者,如果您有任何其他方法来加速,我很乐意接受)。
谢谢:)有没有其他加快速度的方法
具有参数缓存
,其中
如果为True,请使用唯一的转换日期缓存来应用日期时间转换。当解析重复的日期字符串时,可能会产生显著的加速,尤其是带有时区偏移的字符串。缓存仅在至少有50个值时使用。存在越界值将导致缓存不可用,并可能减慢解析速度。
在版本0.25.0中更改:-将默认值从False更改为True
请检查您正在使用的版本(
import pandas;print(pandas.\uu version\uuuuu)
),如果低于0.25.0
请尝试输入cache=True
我尝试了不同的解决方案,并确认了您的发现
import numpy as np
import pandas as pd
first_date = '2020-01-01'
date_range_sample = pd.date_range(
start=pd.to_datetime(first_date),
end=pd.to_datetime(first_date) + pd.Timedelta(hours=800-1),
freq='H'
)
date_range = np.repeat(date_range_sample, 4000)
date_range_str = date_range.strftime('%m/%d/%Y %H%M')
date_range_str_shuffled = date_range_str.copy(deep=True)
np.random.seed(0)
np.random.shuffle(date_range_str_shuffled.to_numpy())
df = pd.DataFrame({
'date': date_range_str,
'date_shuffled': date_range_str_shuffled,
})
使用df.date
非常快
%timeit pd.to_datetime(df.date, format='%m/%d/%Y %H%M')
312 ms ± 2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
使用无序日期列要慢得多
%timeit pd.to_datetime(df.date_shuffled, format='%m/%d/%Y %H%M')
6.46 s ± 19.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
但是,如果我们按照无序的日期时间对数据帧进行排序,我们将返回到更快的行为
df.sort_values(by='date_shuffled', inplace=True)
%timeit pd.to_datetime(df.date_shuffled, format='%m/%d/%Y %H%M')
441 ms ± 1.09 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
但是。。。对混乱的日期进行排序几乎需要4秒钟
%timeit pd.to_datetime(
df.sort_values(by='date_shuffled').date_shuffled,
format='%m/%d/%Y %H%M'
)
4.86 s ± 45.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
嗨,麦克斯,非常感谢你的帮助,帮助大家重新制作。是的,我后来确实试过分类,但正如你提到的,仍然很长。。不知道熊猫为什么要这样做,希望有人能回答。最好的