有这样的df:
Dat
10/01/2016
11/01/2014
12/02/2013
列'Dat'具有对象类型,所以我尝试使用to_datetime()pandas函数将其切换到datetime:
to_datetime_rand = partial(pd.to_datetime, format='%m/%d/%Y')
df['DAT'] = df['DAT'].apply(to_datetime_rand)
一切都运作良好但是当我的df高于20亿行时,我遇到了性能问题。所以在这种情况下,这种方法会停滞不前。
pandas to_datetime()函数是否能够通过循环进行转换,或者通过循环迭代进行转换。
感谢。
答案 0 :(得分:3)
如果考虑到性能,我建议使用以下函数将这些列转换为date_time
:
def lookup(s):
"""
This is an extremely fast approach to datetime parsing.
For large data, the same dates are often repeated. Rather than
re-parse these, we store all unique dates, parse them, and
use a lookup to convert all dates.
"""
dates = {date:pd.to_datetime(date) for date in s.unique()}
return s.apply(lambda v: dates[v])
to_datetime: 5799 ms dateutil: 5162 ms strptime: 1651 ms manual: 242 ms lookup: 32 ms
答案 1 :(得分:2)
您可以将大型数据框拆分为较小的数据框,例如,此方法可以在您可以决定块大小的位置执行此操作:
def splitDataFrameIntoSmaller(df, chunkSize = 10000):
listOfDf = list()
numberChunks = len(df) // chunkSize + 1
for i in range(numberChunks):
listOfDf.append(df[i*chunkSize:(i+1)*chunkSize])
return listOfDf
有块后,可以分别在每个块上应用datetime函数。
答案 2 :(得分:1)
更新:此增强功能已合并到pandas 0.23.0
中缓存:布尔值, 默认为False
如果为True,则使用唯一的转换日期缓存来应用datetime 转换。解析重复项时可能会大大提高速度 日期字符串,特别是带有时区偏移的日期字符串。
答案 3 :(得分:0)
我自己也遇到了同样的问题。感谢SerialDev的出色答案。为此,我尝试使用datetime.strptime而不是pd.to_datetime:
from datetime import datetime as dt
dates = {date : dt.strptime(date, '%m/%d/%Y') for date in df['DAT'].unique()}
df['DAT'] = df['DAT'].apply(lambda v: dates[v])
对于我来说,strptime方法比to_datetime方法快6.5倍。
答案 4 :(得分:0)
从之前的答案中得到启发,在同时存在性能问题和多种日期格式的情况下,我建议采用以下解决方案。
@Repository
public interface KlienciRepository extends JpaRepository<Klienci, Integer> {
@Query(SELECT * from klienci k where k.imieKlienta like "?1%")
List<klienci> findbyfirstname(String firstname);
}