如何更改 Pandas 中的日期时间格式
How to change the datetime format in Pandas
我的数据框有一个 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
相比,我会推荐先用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 notebook 显示您的数据框,或者
- 如果您想以 HTML 文件的形式进行演示(即使有许多准备好的多余
id
和 class
进一步 CSS 样式的属性——您可以使用也可以不使用),
使用styling。 样式不会更改数据框列的数据/数据类型。
现在我将向您展示如何在 Jupyter notebook 中访问它——有关 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
小心!
返回的对象不是数据帧——它是 class Styler
的对象,所以 不要将它分配回 df
:
不要这样做:
df = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")}) # Don't do this!
(每个数据框都可以通过其 .style
属性 访问其 Styler 对象,我们更改了这个 df.style
对象,而不是数据框本身。)
问题与解答:
问: 为什么你的 Styler 对象(或返回它的表达式)用作 Jupyter 笔记本单元格中的最后一个命令 显示您的(样式化的)table,而不是 Styler 对象本身?
A:因为每个Styler对象都有一个回调方法._repr_html_()
其中returns一个HTML渲染代码你的数据框(作为一个不错的 HTML table)。
Jupyter Notebook IDE 调用此方法 自动 来呈现具有它的对象。
注:
您不需要 Jupyter notebook 来设置样式(即为了在不更改其数据/数据类型 的情况下很好地输出数据帧)。
Styler 对象也有一个方法 render()
,如果你想获得一个带有 HTML 代码的字符串(例如,为了将你的格式化数据框发布到 Web,或者只是展示你的 table HTML 格式):
df_styler = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
HTML_string = df_styler.render()
下面是对我有用的代码。我们需要非常注意格式。下面的 link 对于了解您的退出格式和更改为所需格式绝对有用(遵循 strftime() and strptime() Behavior 中的 strftime() 和 strptime() 格式代码):
data['date_new_format'] = pd.to_datetime(data['date_to_be_changed'] , format='%b-%y')
我的数据框有一个 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
相比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 notebook 显示您的数据框,或者
- 如果您想以 HTML 文件的形式进行演示(即使有许多准备好的多余
id
和class
进一步 CSS 样式的属性——您可以使用也可以不使用),
使用styling。 样式不会更改数据框列的数据/数据类型。
现在我将向您展示如何在 Jupyter notebook 中访问它——有关 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
小心!
返回的对象不是数据帧——它是 class Styler
的对象,所以 不要将它分配回 df
:
不要这样做:
df = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")}) # Don't do this!
(每个数据框都可以通过其 .style
属性 访问其 Styler 对象,我们更改了这个 df.style
对象,而不是数据框本身。)
问题与解答:
问: 为什么你的 Styler 对象(或返回它的表达式)用作 Jupyter 笔记本单元格中的最后一个命令 显示您的(样式化的)table,而不是 Styler 对象本身?
A:因为每个Styler对象都有一个回调方法
._repr_html_()
其中returns一个HTML渲染代码你的数据框(作为一个不错的 HTML table)。Jupyter Notebook IDE 调用此方法 自动 来呈现具有它的对象。
注:
您不需要 Jupyter notebook 来设置样式(即为了在不更改其数据/数据类型 的情况下很好地输出数据帧)。
Styler 对象也有一个方法 render()
,如果你想获得一个带有 HTML 代码的字符串(例如,为了将你的格式化数据框发布到 Web,或者只是展示你的 table HTML 格式):
df_styler = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
HTML_string = df_styler.render()
下面是对我有用的代码。我们需要非常注意格式。下面的 link 对于了解您的退出格式和更改为所需格式绝对有用(遵循 strftime() and strptime() Behavior 中的 strftime() 和 strptime() 格式代码):
data['date_new_format'] = pd.to_datetime(data['date_to_be_changed'] , format='%b-%y')