如何更改pandas中的日期时间格式

yom*_*ome 62 python string datetime strftime pandas

DOB列样本值采用格式 - 1/1/2016默认情况下会转换为对象,如下所示

DOB       object
Run Code Online (Sandbox Code Playgroud)

转换为日期格式

df['DOB'] = pd.to_datetime(df['DOB'])
Run Code Online (Sandbox Code Playgroud)

日期转换为

2016-01-26
Run Code Online (Sandbox Code Playgroud)

dtype

DOB       datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

现在我想将此日期格式转换为01/26/2016或以任何其他常规日期格式.我该怎么做?

无论我尝试什么方法,它总是以2016-01-26格式显示日期.

jez*_*ael 120

您可以使用,dt.strftime如果您需要转换datetime为其他格式(但请注意,然后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
Run Code Online (Sandbox Code Playgroud)

  • 'strftime'将datetime列转换为unicode以在DOB1上应用操作,我们再次将其转换为datetime.在没有丢失data_type的情况下,是否还有其他形式的格式化? (24认同)

Yan*_*Cao 12

更改格式但不更改类型:

df['date'] = pd.to_datetime(df["date"].dt.strftime('%Y-%m'))
Run Code Online (Sandbox Code Playgroud)

  • **不!** 假设“日期”列中某项的原始值为“2019 年 11 月 **26**”。`strftime()` 表示 *"来自时间的字符串"*,因此 `df["date"].dt.strftime('%Y-%m')` 将是一个 **字符串** `"2019-11" ` 对于该项目。然后,`pd.to_datetime()` 会将此字符串**回**转换为 `datetime64` 格式,但现在为“November **1**, 2019”!所以结果将是: **没有格式改变,而是日期值本身的改变!** (13认同)
  • @MarianD:您对各个答案的所有评论都是有用的,但是您能否将它们总结为答案底部的“陷阱/不要这样做”的一个汇总?此外,您还需要清楚地说明每个问题的问题是什么:如果任何输入日期不符合预期格式,则这些日期可能会引发异常,或者会破坏日期。简单地写“不!” 到处都没有传达这一点。 (5认同)
  • 请记住,在执行此操作之前 df["date"] 应该是 datetime64 (4认同)

Mar*_*anD 10

之间有区别

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

所以问题是:如何在不更改数据/数据类型本身的情况下达到我的数据的适当表示

这是答案:

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

使用样式样式不会更改数据框列的数据/数据类型。

现在,我将向您展示如何在 Jupyter 笔记本中访问它——对于 HTML 文件形式的演示,请参阅问题末尾附近的注释。

我会假设您的列DOB 已经具有该类型datetime64(您表明您知道如何访问它)。我准备了一个简单的数据框(只有一列)来向您展示一些基本样式:

          DOB
0  2019-07-03
1  2019-08-03
2  2019-09-03
3  2019-10-03
Run Code Online (Sandbox Code Playgroud)
          DOB
0  07/03/2019
1  08/03/2019
2  09/03/2019
3  10/03/2019
Run Code Online (Sandbox Code Playgroud)
          DOB
0  03-07-2019
1  03-08-2019
2  03-09-2019
3  03-10-2019
Run Code Online (Sandbox Code Playgroud)

当心!
返回的对象不是数据帧——它是类的对象Styler,所以不要将它分配回df

不要这样做:

df = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})    # Don´t do this!
Run Code Online (Sandbox Code Playgroud)

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


问题和解答:

  • 问: 为什么用作Jupyter 笔记本单元格中最后一个命令的 Styler 对象(或返回它的表达式)显示您的(样式化的) table,而不是 Styler 对象本身?

  • 答:因为每个 Styler 对象都有一个回调方法._repr_html_(),该方法返回用于呈现数据框的 HTML 代码(作为一个不错的 HTML 表格)。

    Jupyter Notebook IDE 会自动调用此方法来渲染具有它的对象。


笔记:

您不需要 Jupyter 笔记本来进行样式设置(即在不更改其数据/数据类型的情况下很好地输出数据帧)。

render()如果您想获取带有 HTML 代码的字符串(例如,用于将格式化的数据框发布到 Web,或者只是以 HTML 格式显示您的表格),则Styler 对象也有一个方法:

df_styler = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
HTML_string = df_styler.render()
Run Code Online (Sandbox Code Playgroud)

  • 好吧,有一天。只要你不写“不!” 也在它下面:) (2认同)

ris*_*ain 6

The below code worked for me instead of the previous one - try it out !

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

  • **不!** 你的`format='%m/%d/%Y'` 参数用于**解析**一个字符串,即你应该**以这种格式提供字符串**(例如`“2019 年 5 月 13 日”`)。**仅此而已,没有格式更改。** 它仍将显示为 `2019-05-13` — 或者如果 `df['DOB'].astype(str)` 包含项目,它将引发异常) 不采用这种格式,例如采用“2019-05-13”格式。 (7认同)

小智 5

第一个答案相比,我会建议先使用dt.strftime(),然后再使用pd.to_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)
Run Code Online (Sandbox Code Playgroud)

  • 这至少在我的情况下不起作用。具体来说,列被转换为日期时间数据类型,但值也被转换为原始格式! (2认同)