我正在尝试更改熊猫数据框中日期的格式。 如果我检查开始的日期,我有:
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。 如何以更快的方式做到这一点?
答案 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,无需解析器即可快速将其更改为新格式。
谢谢大家的帮助!