在 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。我想通过组合month
和year
列来创建一个新列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 2比Line 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 python 中将字符串转换为日期时间格式?