如何更改 Pandas 中的日期时间格式
- 2024-11-25 08:49:00
- admin 原创
- 155
问题描述:
我的数据框有一DOB
列(示例格式1/1/2016
),默认情况下会转换为 Pandas dtype“对象”。
使用 将其转换为日期格式df['DOB'] = pd.to_datetime(df['DOB'])
,日期将转换为:2016-01-26
并且其dtype
为:datetime64[ns]
。
现在我想将此日期格式转换为01/26/2016
或任何其他通用日期格式。我该怎么做?
(无论我尝试哪种方法,它总是以格式显示日期2016-01-26
。)
解决方案 1:
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
解决方案 2:
两者之间有区别
数据框单元格的内容(二进制值)和
它向我们人类呈现(展示)它。
所以问题是:如何在不改变数据/数据类型本身的情况下实现我的数据的适当呈现?
答案如下:
如果你使用Jupyter 笔记本显示数据框,或者
如果你想以HTML 文件的形式进行演示(即使已经准备好了许多多余的
id
属性class
以便进一步进行CSS 样式设置 — — 你可能会用到它们,也可能不会用到它们),
使用样式。样式不会更改数据框列的数据/数据类型。
现在我向您展示如何在 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!
(每个数据框都有可通过其属性访问的 Styler 对象.style
,我们更改的是此df.style
对象,而不是数据框本身。)
问答:
问: 为什么用作Jupyter 笔记本单元格中最后一个命令的 Styler 对象(或返回它的表达式)显示你的(样式)表格,而不是 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()
解决方案 3:
改变格式但不改变类型:
df['date'] = pd.to_datetime(df["date"].dt.strftime('%Y-%m'))
解决方案 4:
与第一个答案相比,我建议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)
解决方案 5:
下面的代码对我有用,而不是以前的代码:
df['DOB']=pd.to_datetime(df['DOB'].astype(str), format='%m/%d/%Y')
解决方案 6:
你可以试试这个。它会将日期格式转换为 DD-MM-YYYY:
df['DOB'] = pd.to_datetime(df['DOB'], dayfirst = True)
解决方案 7:
df['variable'] = pd.to_datetime(df['variable'],errors='coerce') 复制代码
解决方案 8:
下面的代码更改为“datetime”类型并格式化给定的格式字符串。
df['DOB'] = pd.to_datetime(df['DOB'].dt.strftime('%m/%d/%Y'))
解决方案 9:
以下是对我有用的代码。我们需要非常小心格式。以下链接对于了解您现有的格式并更改为所需格式绝对有用(请遵循 strftime() 和 strptime() 行为中的 strftime () 和 strptime()格式代码):
data['date_new_format'] = pd.to_datetime(data['date_to_be_changed'] , format='%b-%y')