在 Pandas 中将字符串列转换为日期的有效方法(在 Python 中),但没有时间戳

Posted

技术标签:

【中文标题】在 Pandas 中将字符串列转换为日期的有效方法(在 Python 中),但没有时间戳【英文标题】:Efficient way of converting String column to Date in Pandas (in Python), but without Timestamp 【发布时间】:2018-01-14 12:15:52 【问题描述】:

我有一个包含两个字符串列df['month']df['year'] 的DataFrame。我想通过组合monthyear 列来创建一个新列df['date']。我已经使用下面的结构成功地做到了 -

df['date']=pd.to_datetime((df['month']+df['year']),format='%m%Y')

df['month'] = '08' and df['year']='1968' 的地址

we get df['date']=1968-08-01

这正是我想要的。

手头的问题:我的 DataFrame 有超过 200,000 行,我注意到有时,此外,我还得到如下几行的时间戳,我想避免这种情况 -

1972-03-01 00:00:00

我通过使用.dt 访问器解决了这个问题,该访问器可用于操作系列,因此我使用以下代码仅显式提取日期-

df['date']=pd.to_datetime((df['month']+df['year']),format='%m%Y') #Line 1
df['date']=df['date']=.dt.date               #Line 2

问题解决了,只是Line 2Line 1多花了5倍的时间。

问题:有什么方法可以调整第 1 行,使其只提供日期而不是时间戳?我确信这个简单的问题不可能有如此低效的解决方案。我能否以更节省时间和资源的方式解决此问题?

【问题讨论】:

在我看来它很慢,因为原生 pandas 格式是 datetime64,没有 python 日期。我尝试(df['month']+df['year']).apply(lambda x: datetime.strptime(x, '%m%Y').date()),但速度较慢:( 是的,lambda 解决方案通常会慢一点,我可以理解这个解决方案也更慢。我正在比较 SAS 和 Pandas 的速度,不幸的是 Pandas 在很多情况下都比较慢。或者我可能以错误的方式应用它。一如既往地感谢 jezreal 的投入。非常感谢:) 嗯,这很有趣。 SAS更快?多少次? 对于这个特定的数据集,我有大约 500 万行,我执行多项操作,如排序、将大小写从混合变为小写等,总共花了我 42 秒 在 SAS 中和在 Python 中的 Pandas 中,我花了 264 秒。 6 倍。 谢谢。真的很慢。 【参考方案1】:

AFAIk 我们没有 date dtype n Pandas,我们只有 datetime,所以我们总会有时间部分。

虽然 Pandas 显示:1968-08-01,但它有一个时间部分:00:00:00

演示:

In [32]: df = pd.DataFrame(pd.to_datetime(['1968-08-01', '2017-08-01']), columns=['Date'])

In [33]: df
Out[33]:
        Date
0 1968-08-01
1 2017-08-01

In [34]: df['Date'].dt.time
Out[34]:
0    00:00:00
1    00:00:00
Name: Date, dtype: object

如果你想有一个字符串表示,有一个更快的方法:

df['date'] = df['year'].astype(str) + '-' + df['month'].astype(str) + '-01'

更新:注意.dt.date会给你一个字符串表示:

In [53]: df.dtypes
Out[53]:
Date    datetime64[ns]
dtype: object

In [54]: df['new'] = df['Date'].dt.date

In [55]: df
Out[55]:
        Date         new
0 1968-08-01  1968-08-01
1 2017-08-01  2017-08-01

In [56]: df.dtypes
Out[56]:
Date    datetime64[ns]
new             object   # <--- NOTE !!!
dtype: object

【讨论】:

好吧,我不想要字符串表示。那本来应该是直截了当的 :) 就是说,如果时间部分是隐藏的,那么为什么它有时会显示而有时却没有呢? @OliverS,请注意df['date'].dt.date 会给你一个字符串 表示。详情见“更新” 你是对的 MaxU。我没有意识到这一点。非常感谢您引起注意。这使得将 Datetime 转换为仅仅 Date 的想法毫无用处,因为如果想法是转换为 String,那么为什么不简单地连接,而不是遵循这个漫长的过程不求回报。非常感谢您的意见。非常感谢。 MaxU,我想我得到了激发这个问题的原始问题的答案。不用说,您为我解决了最初的问题!但是,如果我将此问题标记为已回答,那么它会给人一种错误的印象,即存在一种提取日期的有效方法。所以,我会羞于将其标记为已回答。希望它没事 MaxU。 @OliverS,当然:)

以上是关于在 Pandas 中将字符串列转换为日期的有效方法(在 Python 中),但没有时间戳的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在pyspark中将字符串列转换为ArrayType

如何在 pandas python 中将字符串转换为日期时间格式?

在 Databricks SQL 中将字符串转换为日期返回 null

如何在配置单元中将字符串数据类型列转换为日期格式

在 Pandas 中将字典转换为对称/距离矩阵的最有效方法