将日期字符串转换为 pandas 时间序列索引的最有效方法

Posted

技术标签:

【中文标题】将日期字符串转换为 pandas 时间序列索引的最有效方法【英文标题】:Most efficient way to convert date strings to a pandas time series index 【发布时间】:2017-10-18 16:21:44 【问题描述】:

我的 CSV 数据文件包含以下格式的日期:

In: data["DayIndex"].unique()

Out: array(['04/23/17', '04/20/17', '04/21/17', '04/24/17', '04/22/17',
       '05/02/17', '04/27/17', '05/06/17', '04/30/17', '04/25/17',
       '04/26/17', '05/04/17'], dtype=object)    

我想把它变成一个合适的 pandas 时间序列。我试过这个:

data["DayIndex"] = pandas.DatetimeIndex(data["Day"])

即使是几十万行也需要很长时间。我有哪些加快解析速度的选项?

【问题讨论】:

查看我的更新答案...如果您有十万行...我假设您有很多重复...在这种情况下,您可能会看到从我最近添加的。 【参考方案1】:
data['DayIndex'] = pandas.to_datetime(data['Day'])

加入@ayhan 的评论

data['DayIndex'] = pandas.to_datetime(data['Day'], format='%m/%d/%Y')

或者当您从 csv 导入时,包括 parse_dates

data = read_csv(..., parse_dates=['Day'],
     date_parser=lambda s: pandas.datetime.strptime(s, '%m/%d/%y'))

不确定这是否已被纳入最新版本的 pandas...我不这么认为,至少我没有在“新增功能”部分中看到它...

无论如何,我们可以构建一个自定义解析器来重用旧的解析,而不是重新解析我们已经看到的相同日期。

让我们使用map 和一些巧妙的散列。

# let u be unique date stings.  We'll do this so that we only parse them once.
u = pd.unique(data['Day'])

# then build a dictionary of these
m = dict(zip(u, pd.to_datetime(u, format='%m/%d/%Y')))

# then use `map` to build the new column
data['DayIndex'] = data['Day'].map(m)

时机

a = np.random.choice(
    ['04/23/17', '04/20/17', '04/21/17', '04/24/17', '04/22/17',
     '05/02/17', '04/27/17', '05/06/17', '04/30/17', '04/25/17',
     '04/26/17', '05/04/17'],
    100000)

data = pd.DataFrame(dict(Day=a))


%%timeit
u = pd.unique(a)
m = dict(zip(u, pd.to_datetime(u, format='%m/%d/%y'))) 
data['Day'].map(m)
100 loops, best of 3: 15.4 ms per loop

%timeit pd.to_datetime(data['Day'], format='%m/%d/%y')
1 loop, best of 3: 206 ms per loop

【讨论】:

顺便说一句,如果你也传递格式,它会变得更快。

以上是关于将日期字符串转换为 pandas 时间序列索引的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

将 datetime64[ns] 索引转换为日期 pandas 以进行比较

将 unix 时间转换为 pandas 数据框中的可读日期

如何将两列中的日期和时间放入pandas to_datetime并设置为索引[重复]

Python Pandas Dataframe 将特定的日期时间行标签设置为索引中的字符串?

Pandas分组统计与时间序列

将 JSON 时间戳字符串转换为 pandas 数据框中的 python 日期