如何在Pandas中更改日期时间格式

e4yzc0pl  于 2023-05-21  发布在  其他
关注(0)|答案(8)|浏览(126)

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

w9apscun

w9apscun1#

如果需要将datetime转换为其他格式,可以使用dt.strftime(但请注意,列的dtype将是objectstring)):

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
z9smfwbn

z9smfwbn2#

更改格式但不更改类型:

df['date'] = pd.to_datetime(df["date"].dt.strftime('%Y-%m'))
btqmn9zl

btqmn9zl3#

之间有区别

  • Dataframe 单元格的内容(二进制值),以及
  • 它的展示给我们人类。

所以问题是:如何在不更改数据/数据类型本身的情况下实现数据的适当表示
答案如下:

  • 如果您使用Jupyter notebook来显示 Dataframe ,或者
  • 如果你想以HTML文件的形式呈现一个演示文稿(即使有许多准备好的多余的idclass属性用于 * 进一步 * CSS样式-你可能会使用,也可能不会使用它们),

使用 * styling *。样式化不会改变数据框的数据/数据类型。
现在,我将向您展示如何在Jupyter notebook中访问它-对于HTML文件形式的演示,请参阅本答案结尾处的注解。
我假设你的列DOB * 已经有datetime64类型 *(你已经表明你知道如何到达它)。我准备了一个简单的dataframe(只有一列)来展示一些基本的样式:

  • 未设置样式:
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

小心!*
返回的对象不是一个dataframe -它是类Styler的对象,所以 * 不要将它赋值回df:*

不要这样做:

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

(每个dataframe都有其Styler对象,可以通过其.style属性访问,我们更改了这个df.style对象,而不是dataframe本身。

问题和答案:
*Q:为什么你的Styler对象(或返回它的表达式)在Jupyter notebook单元格中用作最后一个命令会显示你的(样式化的)表,而不是Styler对象本身?
***A:**因为每个Styler对象都有一个回调方法._repr_html_(),它返回一个HTML代码来渲染你的 Dataframe (作为一个漂亮的HTML表)。

Jupyter Notebook IDE会自动调用这个方法来渲染拥有它的对象。

注:

你不需要Jupyter notebook来进行样式化(即,在不更改其数据/数据类型的情况下很好地输出dataframe *)。
Styler对象也有一个方法render(),如果你想用HTML代码获取一个字符串(例如,在Web上发布格式化的 Dataframe ,或者只是以HTML格式显示表格):

df_styler = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
HTML_string = df_styler.render()
mu0hgdu0

mu0hgdu04#

与第一个答案相比,我建议先使用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)
fquxozlt

fquxozlt5#

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

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

ffx8fchx6#

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

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

v9tzhpje7#

下面的代码将更改为“datetime”类型,并以给定的格式字符串进行格式化。

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

r7xajy2e8#

下面是我的代码。我们需要非常小心的格式。下面的链接对于了解您现有的格式和更改为所需的格式绝对有用(遵循 * strftime()和strptime()Behavior* 中的strftime()和strptime()格式代码):

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

相关问题