首页 > 解决方案 > 读取 csv 时加快日期时间格式化

问题描述

我有一个包含 4+m 记录的 csv 文件。

我使用 pd.read_csv('big_file.csv', dtype=object) 导入它

该文件有 2 列,日期格式如下:'yyyy-mm-ddThh:mm:ss.nsTZ' 例如'2018-05-05T04:39:09.447Z'

我需要将它们转换为 'yyyy-mm-dd H:M:S' 例如 '2018-09-23 06:03:12'

我使用以下代码来执行此操作:

df['created'] = pd.to_datetime(arg=df.created).dt.strftime('%Y-%m-%d %H:%M:%S')
df['lastLogin'] = pd.to_datetime(arg=df.lastLogin).dt.strftime('%Y-%m-%d %H:%M:%S')
df['lastUpdated'] = pd.to_datetime(arg=df.lastUpdated).dt.strftime('%Y-%m-%d %H:%M:%S')
df['created'] = pd.to_datetime(arg=df.created)
df['lastLogin'] = pd.to_datetime(arg=df.lastLogin)
df['lastUpdated'] = pd.to_datetime(arg=df.lastUpdated)

这个过程非常缓慢:

CPU times: user 1min 48s, sys: 1.19 s, total: 1min 49s
Wall time: 1min 49s

有没有办法加快速度?

标签: pythonpython-3.xpandas

解决方案


由于您的时间戳遵循非标准格式,因此我建议在读取 csv 文件时将参数parse_datesdate_parser与自定义解析器一起使用,例如:

parser = lambda date: pd.datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%Z')
df = pd.read_csv('big_file.csv', 
                 parse_dates=['created', 'lastLogin', 'lastUpdated'],
                 date_parser=parser)

来自熊猫文档

date_parser : 函数,可选

用于将字符串列序列转换为日期时间实例数组的函数。默认使用 dateutil.parser.parser 进行转换。Pandas 将尝试以三种不同的方式调用 date_parser,如果发生异常则前进到下一种方式: 1) 传递一个或多个数组(由 parse_dates 定义)作为参数;2) 将 parse_dates 定义的列中的字符串值连接(按行)到单个数组中并传递它;3) 使用一个或多个字符串(对应于 parse_dates 定义的列)作为参数,为每一行调用一次date_parser 。


推荐阅读