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

String 在Pandas(Python)中将字符串列转换为日期的有效方法,但不带时间戳,string,pandas,date,type-conversion,timestamp,String,Pandas,Date,Type Conversion,Timestamp,我有一个数据框,它包含两个字符串列df['month']和df['year']。我想通过组合month和year列来创建一个新列df['date']。我使用下面的结构成功地做到了这一点- df['date']=pd.to_datetime((df['month']+df['year']),format='%m%Y') 其中,df['month']='08'和df['year']='1968' we get df['date']=1968-08-01 这正是我想要的 眼前的问题:我的数据帧有2

我有一个数据框,它包含两个字符串列
df['month']
df['year']
。我想通过组合
month
year
列来创建一个新列
df['date']
。我使用下面的结构成功地做到了这一点-

df['date']=pd.to_datetime((df['month']+df['year']),format='%m%Y')
其中,
df['month']='08'和df['year']='1968'

we get df['date']=1968-08-01
这正是我想要的

眼前的问题:我的数据帧有200000多行,我注意到,有时,除此之外,我还会得到下面几行的时间戳,我希望避免这种情况-

1972-03-01 00:00:00
我通过使用
.dt
acessor解决了这个问题,它可以用来处理序列,因此我使用下面的代码只显式提取了日期-

df['date']=pd.to_datetime((df['month']+df['year']),format='%m%Y') #Line 1
df['date']=df['date']=.dt.date               #Line 2
问题解决了,只是2号线比1号线多花了5倍的时间


问题:有没有办法调整第1行,只给出日期而不给出时间戳?我相信这个简单的问题不可能有如此低效的解决办法。我能否以更节省时间和资源的方式解决此问题?

如果我们没有
date
dtype n Pandas,我们只有
datetime
,因此我们将始终有一个时间部分

即使熊猫显示:
1968-08-01
,它也有一个时间段:
00:00:00

演示:

如果您想使用字符串表示,有一种更快的方法:

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
[53]中的
:df.dtypes
出[53]:
日期时间64[ns]
数据类型:对象
在[54]中:df['new']=df['Date'].dt.Date
In[55]:df
出[55]:
新日期
0 1968-08-01  1968-08-01
1 2017-08-01  2017-08-01
In[56]:df.dtypes
出[56]:
日期时间64[ns]

新对象#在我看来它很慢,因为本机pandas格式是datetime64,没有python日期。我尝试
(df['month']+df['year'])。应用(lambda x:datetime.strtime(x,%m%Y').date())
,但速度较慢:(是的,lambda解决方案通常稍微慢一点,我可以理解这一个也慢一点。我比较了SAS和Pandas的速度,不幸的是Pandas在很多情况下都慢一点。或者可能是我以错误的方式应用了它。感谢jezreal一如既往地提供您的意见。非常感谢:)嗯,这很有趣。SAS更快?多少倍?对于这个特定的数据集,我有大约500万行,我做了多种操作,如排序,将大小写从混合改为小写等,在SAS中总共花了我42秒,在Python中花了我264秒。多谢。真的很慢。嗯,我不想要字符串表示法。它应该是直截了当的:)也就是说,如果时间部分是隐藏的,那么为什么它有时会出现,而其他时候不会出现?@OliverS,请注意,
df['date'].dt.date
会给你一个字符串表示法。请参阅“更新”了解详细信息您是对的。我没有意识到这一点。非常感谢你让我注意到这一点。这使得将Datetime转换为Date的想法变得毫无用处,因为如果要将其转换为字符串,那么为什么不简单地连接起来,而不是毫无意义地遵循这个漫长的过程呢。非常感谢您的投入。非常感谢。MaxU,我想我已经得到了最初问题的答案,正是这个问题的动机。不用说,你为我解决了最初的问题!但是,如果我将这个问题标记为已回答,那么它会给人一种错误的印象,即存在一种提取日期的有效方法。所以,我会羞于标记它。希望一切顺利,马克斯。@OliverS,当然:)
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