我的dataframe有一个DOB列(示例格式1/1/2016),默认情况下转换为Pandas dtype“对象”。
将此转换为日期格式df['DOB'] = pd.to_datetime(df['DOB']),日期转换为:2016-01-26,其dtype为:datetime64[ns]。
现在我想把这个日期格式转换成01/26/2016或任何其他通用日期格式。我该怎么做?
(无论我尝试哪种方法,它总是以2016-01-26的格式显示日期。)
我的dataframe有一个DOB列(示例格式1/1/2016),默认情况下转换为Pandas dtype“对象”。
将此转换为日期格式df['DOB'] = pd.to_datetime(df['DOB']),日期转换为:2016-01-26,其dtype为:datetime64[ns]。
现在我想把这个日期格式转换成01/26/2016或任何其他通用日期格式。我该怎么做?
(无论我尝试哪种方法,它总是以2016-01-26的格式显示日期。)
当前回答
改变格式但不改变类型:
df['date'] = pd.to_datetime(df["date"].dt.strftime('%Y-%m'))
其他回答
下面的代码为我工作,而不是前面的一个:
df['DOB']=pd.to_datetime(df['DOB'].astype(str), format='%m/%d/%Y')
两者之间是有区别的
数据帧单元格的内容(二进制值)和 它为我们人类呈现(展示)它。
因此,问题是:如何在不更改数据/数据类型本身的情况下实现数据的适当表示?
以下是答案:
如果您使用Jupyter笔记本显示您的数据框架,或 如果你想要以HTML文件的形式呈现(即使有许多准备好的多余的id和class属性用于进一步的CSS样式—你可能会使用它们,也可能不会使用它们),
使用样式。样式化不会改变数据框架中列的数据/数据类型。
现在我向你展示如何在Jupyter笔记本上找到它-以HTML文件的形式进行演示,请参阅这个答案末尾的注释。
我假设您的列DOB已经具有datetime64类型(您已经表明您知道如何达到它)。我准备了一个简单的数据框架(只有一列),向你展示一些基本的样式:
风格: df
出生日期 0 2019-07-03 1 2019-08-03 2 2019-09-03 3 2019-10-03
样式为mm/dd/yyyy: df.style。format({"DOB": lambda t: t.s rftime("%m/%d/%Y")})
强加于人 0 07/03/2019 1 08/03/2019 2 09/03/2019 3 10/03/2019
样式为dd-mm-yyyy: df.style。format({"DOB": lambda t: t.s rftime("%d-%m-%Y")})
DOB 0 03-07-2019 1 03-08-2019 2 03-09-2019 3 03-10-2019
小心! 返回的对象不是一个dataframe——它是Styler类的一个对象,所以不要把它赋值给df:
不要这样做:
df = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")}) # Don't do this!
(每个dataframe都有它的Styler对象,可以通过它的.style属性访问,我们改变了这个df。样式对象,而不是数据框架本身。)
问题和答案:
问:为什么你的Styler对象(或一个返回它的表达式)被用作Jupyter笔记本单元格的最后一个命令显示你的(有样式的)表格,而不是Styler对象本身? 答:因为每个Styler对象都有一个回调方法._repr_html_(),它返回一个HTML代码来渲染你的数据帧(作为一个漂亮的HTML表)。 Jupyter Notebook IDE自动调用此方法来渲染具有该方法的对象。
注意:
你不需要Jupyter笔记本的样式(即,在不改变其数据/数据类型的情况下输出一个数据框架)。
Styler对象也有一个方法render(),如果你想用HTML代码获取一个字符串(例如,用于在Web上发布格式化的数据帧,或者简单地以HTML格式显示你的表):
df_styler = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
HTML_string = df_styler.render()
下面的代码更改为'datetime'类型,并在给定的格式字符串中格式化。
df['DOB'] = pd.to_datetime(df['DOB'].dt.strftime('%m/%d/%Y'))
与第一个答案相比,我建议首先使用dt.strftime(),然后使用pd.to_datetime()。通过这种方式,它仍然会产生datetime数据类型。
例如,
import pandas as pd
df = pd.DataFrame({'DOB': {0: '26/1/2016 ', 1: '26/1/2016 '})
print(df.dtypes)
df['DOB1'] = df['DOB'].dt.strftime('%m/%d/%Y')
print(df.dtypes)
df['DOB1'] = pd.to_datetime(df['DOB1'])
print(df.dtypes)
你可以用dt。如果你需要将datetime转换为其他格式,则使用Strftime(但注意,列的dtype将为object (string)):
import pandas as pd
df = pd.DataFrame({'DOB': {0: '26/1/2016', 1: '26/1/2016'}})
print (df)
DOB
0 26/1/2016
1 26/1/2016
df['DOB'] = pd.to_datetime(df.DOB)
print (df)
DOB
0 2016-01-26
1 2016-01-26
df['DOB1'] = df['DOB'].dt.strftime('%m/%d/%Y')
print (df)
DOB DOB1
0 2016-01-26 01/26/2016
1 2016-01-26 01/26/2016