日期格式的更快解决方案

时间:2019-01-17 21:02:07

标签: python pandas date datetime datetime-format

我正在尝试更改熊猫数据框中日期的格式。 如果我检查开始的日期,我有:

df['Date'][0]
Out[158]: '01/02/2008'

然后,我使用:

df['Date'] = pd.to_datetime(df['Date']).dt.date  

要将格式更改为

df['Date'][0]
Out[157]: datetime.date(2008, 1, 2)

但是,这很费时间,因为我的数据框有数百万行。

我要做的就是将日期格式从MM-DD-YYYY更改为YYYY-MM-DD。 如何以更快的方式做到这一点?

3 个答案:

答案 0 :(得分:1)

您应该首先使用Date方法groupby折叠以减小问题的范围。

然后,您将日期解析为新格式,并将结果合并回原始DataFrame。

由于合并,这需要一些时间,但是它利用了许多日期会重复很多次这一事实。您只希望一次转换每个日期!

您可以使用以下代码:

date_parser = lambda x: pd.datetime.strptime(str(x), '%m/%d/%Y')

df['date_index'] = df['Date']
dates = df.groupby(['date_index']).first()['Date'].apply(date_parser)

df = df.set_index([ 'date_index' ])
df['New Date'] = dates
df = df.reset_index()

df.head()

对于我来说,具有300万行的DataFrame的执行时间从30秒减少到约1.5秒。

答案 1 :(得分:0)

我不确定这是否会对性能问题有所帮助,因为我尚未对您规模的数据集进行过测试,但至少从理论上讲,这应该有所帮助。 Pandas有一个内置参数,您可以用来指定它应将列作为日期或日期时间字段加载。请参阅熊猫文档中的parse_dates参数。

只需传入要解析为日期的列列表,大熊猫将在创建DataFrame时为您转换这些列。然后,您不必担心循环回数据框并在之后尝试转换。

import pandas as pd

df = pd.read_csv('test.csv', parse_dates=[0,2])

上面的示例将尝试将第1列和第3列(从零开始)解析为日期。

每个结果列值的类型将是pandas时间戳,然后您可以使用pandas将其打印出来,但是在使用数据框时需要。

答案 2 :(得分:0)

在@pygo发表评论之后,我发现我的错误是试图将数据读取为

df['Date'] = pd.to_datetime(df['Date']).dt.date  

这将是this answer所解释的:

  

这是因为当熊猫具有非默认格式或未提供格式字符串时,它会回落到dateutil.parser.parse来解析字符串(这更灵活,但也更慢)。

     

如上所示,您可以通过向to_datetime提供格式字符串来提高性能。或者另一个选择是使用infer_datetime_format = True

在使用以上答案中的任何日期解析器时,我们都会进入for循环。同样,当在pd.to_datetime中指定所需的格式(而不是所需的格式)时,我们也会进入for循环。

因此,而不是这样做

df['Date'] = pd.to_datetime(df['Date'],format='%Y-%m-%d')

df['Date'] = pd.to_datetime(df['Date']).dt.date  

我们应该做

df['Date'] = pd.to_datetime(df['Date'],format='%m/%d/%Y').dt.date

通过提供数据的当前格式,可以将其真正快速地读取为日期时间格式。然后,使用.dt.date,无需解析器即可快速将其更改为新格式。

谢谢大家的帮助!