如何改变日期时间格式在熊猫

我的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格式显示日期。)

720549 次浏览

如果需要将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

第一个答案相比,我建议先使用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['date'] = pd.to_datetime(df["date"].dt.strftime('%Y-%m'))

下面的代码为我工作,而不是前面的一个:

df['DOB']=pd.to_datetime(df['DOB'].astype(str), format='%m/%d/%Y')

下面的代码更改为'datetime'类型,并在给定的格式字符串中格式化。

df['DOB'] = pd.to_datetime(df['DOB'].dt.strftime('%m/%d/%Y'))

你可以试试这个。它会将日期格式转换为DD-MM-YYYY:

df['DOB'] = pd.to_datetime(df['DOB'], dayfirst = True)

两者之间是有区别的

  • 数据帧单元格的内容(二进制值)和
  • 它的演讲(显示它)为我们人类。

所以问题是:如何在不改变数据/数据类型本身的情况下到达我的数据的适当演讲 ?

以下是答案:

  • 如果你使用Jupyter笔记本来显示你的数据帧,或者
  • 如果你想以HTML文件的形式获得一个表示(即使有许多准备好的多余的idclass属性用于进一步 CSS样式——你可以使用它们,也可以不使用它们),

使用定型样式化不会改变数据框架中列的数据/数据类型。

现在我向你展示如何在Jupyter笔记本上找到它-以HTML文件的形式进行演示,请参阅这个答案末尾的注释。

我将假设你的列DOB 已经有datetime64类型(你已经表明你知道如何到达它)。我准备了一个简单的数据框架(只有一列),向你展示一些基本的样式:

  • < p >样式:

    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

< p > 小心!
返回的对象不是数据帧——它是类Styler的对象,因此不要将它赋值回df:

不要这样做:

df = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})    # Don't do this!

(每个数据帧都有它的Styler对象,可以通过它的.style属性访问,我们改变的是这个df.style对象,而不是数据帧本身。)


问题和答案:

  • 问: 为什么是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()

下面是对我有用的代码。我们需要注意格式。下面的链接对于了解现有格式并更改为所需格式绝对有用(遵循strftime() and strptime() Behavior .中的strftime()和strptime()格式代码):

data['date_new_format'] = pd.to_datetime(data['date_to_be_changed'] , format='%b-%y')