将日期时间列转换为字符串列

53

我想在 Pandas 数据帧中将日期时间列转换回字符串。

目前我有以下语法:

all_data['Order Day new'] = dt.date.strftime(all_data['Order Day new'], '%d/%m/%Y')

但是这会返回错误:

描述符 'strftime' 需要一个 'datetime.date' 对象,但收到了一个 'Series'。

有人能告诉我我错在哪里吗?

4个回答

98

如果您使用的是版本0.17.0或更高版本,则可以使用.dt.strftime进行矢量调用:

all_data['Order Day new'] = all_data['Order Day new'].dt.strftime('%Y-%m-%d')

** 如果您的 pandas 版本旧于 0.17.0,则必须调用 apply 并将数据传递给 strftime

In [111]:

all_data = pd.DataFrame({'Order Day new':[dt.datetime(2014,5,9), dt.datetime(2012,6,19)]})
print(all_data)
all_data.info()
  Order Day new
0    2014-05-09
1    2012-06-19
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2 entries, 0 to 1
Data columns (total 1 columns):
Order Day new    2 non-null datetime64[ns]
dtypes: datetime64[ns](1)
memory usage: 32.0 bytes

In [108]:

all_data['Order Day new'] = all_data['Order Day new'].apply(lambda x: dt.datetime.strftime(x, '%Y-%m-%d'))
all_data
Out[108]:
  Order Day new
0    2014-05-09
1    2012-06-19
In [109]:

all_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2 entries, 0 to 1
Data columns (total 1 columns):
Order Day new    2 non-null object
dtypes: object(1)
memory usage: 32.0+ bytes

由于该列不理解Series作为参数,因此无法在该列上调用strftime,因此出现错误。


1
在 pandas 1.0.5 中,这会产生一个 SettingWithCopyWarning - Andi

32
all_data['Order Day new']=all_data['Order Day new'].astype(str)

如果日期已经以字符串形式按照你所需的格式存在,那么我认为这更简单。


请通过编辑您的答案添加一些解释,以便其他人可以从中学习。 - Nico Haase
1
@NicoHaase 没有太多需要解释的,只是使用.astype方法。 - Chris
@NicoHaase 好的,已添加,更简单了。 - Chris
1
我检查了一下,是的。 - Chris
我喜欢这个答案,它似乎可以处理列中的NaT值。 - Malachi Bazar
显示剩余2条评论

15

要将所有日期时间列转换为字符串,请使用以下代码。

for x in  df.select_dtypes(include=['datetime64']).columns.tolist():
    df[x] = df[x].astype(str)
或者
date_columns = df.select_dtypes(include=['datetime64']).columns.tolist()
df[date_columns] = df[date_columns].astype(str)

0

在我的情况下,我有一个pySpark数据框。这是我如何将类型为时间戳的“day”转换为字符串:

import pyspark.sql.functions as F
convertedDf = rawDf.withColumn('d2', F.date_format(rawDf['day'], 'yyyyMMdd'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接