我的dataframe有一个DOB
列(示例格式 1/1/2016
),默认情况下转换为Pandas dtype 'object'。
用df['DOB'] = pd.to_datetime(df['DOB'])
将此转换为日期格式,日期转换为: 2016-01-26
,其dtype
为:datetime64[ns]
。
现在我想将此日期格式转换为 01/26/2016
或任何其他通用日期格式。我该怎么做呢?
(无论我尝试什么方法,它总是以2016-01-26
格式显示日期。)
如果您需要将datetime
转换为其他格式,则可以使用dt.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
改变格式但不改变类型:
df['date'] = pd.to_datetime(df["date"].dt.strftime('%Y-%m'))
- 数据帧单元格的内容(二进制值)和
- 它的表示(显示它)给我们,人类。
答案如下:
- 如果你使用Jupyter笔记本显示你的数据帧,或者
- 如果你想以HTML文件的形式呈现(即使为进一步的 CSS样式准备了许多多余的
id
和class
属性-你可以或不可以使用它们),
使用em>样式。样式不改变数据框列的数据/数据类型
现在我向您展示如何在Jupyter笔记本中访问它—要获得HTML文件形式的演示文稿,请参阅本回答末尾的注释。
我将假设您的列DOB
已经具有datetime64
类型(您已经表明您知道如何到达它)。我准备了一个简单的数据框架(只有一列)来展示一些基本的样式:
-
不是风格:
df
DOB 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.strftime("%m/%d/%Y")})
DOB 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.strftime("%d-%m-%Y")})
DOB 0 03-07-2019 1 03-08-2019 2 03-09-2019 3 03-10-2019
小心!
返回的对象不是一个数据帧——它是Styler
类的对象,所以不要把它赋值给df
:
不要这样做:
df = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")}) # Don't do this!
(每个数据框都有它的样式对象,可以通过它的.style
属性访问,我们改变了这个df.style
对象,而不是数据框本身。)
问答:
Q: 为什么您的Styler对象(或返回它的表达式)用作在Jupyter笔记本单元格中的最后一个命令 显示您的(样式)表,而不是Styler对象本身?
A:因为每个Styler对象都有一个回调方法
._repr_html_()
,它返回一个HTML代码来呈现你的数据框(作为一个漂亮的HTML表)。Jupyter Notebook IDE自动调用方法来渲染具有该方法的对象。
注意:
您不需要Jupyter notebook来进行样式化(即,在不更改数据/数据类型的情况下输出数据框架)。
一个Styler对象也有一个方法render()
,如果你想获得一个带有HTML代码的字符串(例如,在Web上发布格式化的数据框,或者简单地以HTML格式呈现你的表):
df_styler = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
HTML_string = df_styler.render()
对比第一个答案,我建议先使用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)
下面的代码代替了前面的代码:
df['DOB']=pd.to_datetime(df['DOB'].astype(str), format='%m/%d/%Y')
你可以试试这个。它会将日期格式转换为DD-MM-YYYY:
df['DOB'] = pd.to_datetime(df['DOB'], dayfirst = True)
下面的代码更改为'datetime'类型,并以给定的格式字符串进行格式化。
df['DOB'] = pd.to_datetime(df['DOB'].dt.strftime('%m/%d/%Y'))
下面是为我工作的代码。我们需要非常注意格式。下面的链接对于了解现有格式并将其更改为所需格式(遵循strftime()和strptime() Behavior中的strftime()和strptime()格式代码)非常有用:
data['date_new_format'] = pd.to_datetime(data['date_to_be_changed'] , format='%b-%y')