Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使pd.to_datetime()更快_Python_Pandas_Dataframe - Fatal编程技术网

Python 使pd.to_datetime()更快

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

我有一个关于熊猫的问题:

我有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_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)

嗨,麦克斯,非常感谢你的帮助,帮助大家重新制作。是的,我后来确实试过分类,但正如你提到的,仍然很长。。不知道熊猫为什么要这样做,希望有人能回答。最好的