如何在Pandas中更改日期时间格式
如何在Pandas中更改日期时间格式
在Pandas中,有一个区别:
- 数据帧单元格的内容(二进制值)和
- 它的演示(人类可视化)
所以问题是:如何在不改变数据/数据类型本身的情况下达到适当的演示效果呢?
答案是使用样式。样式不会改变数据/数据类型的列。
如果您在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。
问题和答案:
问:为什么在Jupyter笔记本单元格的最后一个命令中,您的Styler对象(或返回它的表达式)显示了格式化的表格,而不是Styler对象本身?
答:因为每个Styler对象都有一个回调方法._repr_html_(),它返回一个用于呈现数据帧的HTML代码(作为漂亮的HTML表格)。Jupyter Notebook IDE会自动调用该方法来呈现具有该方法的对象。
注:
不需要Jupyter笔记本来应用样式化(即以漂亮的方式输出数据帧而不改变其数据/数据类型)。Styler对象还有一个方法render(),如果要获取带有HTML代码的字符串(例如,用于在Web上发布格式化的数据帧或以HTML格式呈现表格),则可以使用该方法。
需要注意的是,此样式化代码只能在Jupyter笔记本中运行,而在控制台或iPython中运行时不会产生任何效果。
以上内容是关于如何在Pandas中更改日期时间格式的解决方法。
Pandas是一个非常强大的数据分析工具,它提供了各种功能来处理和操作数据。其中一个常见的需求是改变日期时间的格式。在Pandas中,我们可以使用pd.to_datetime()
函数将日期时间转换为指定格式。然而,在实际操作中,可能会遇到一些问题,导致格式没有改变,但日期值本身发生了改变。
一个常见的错误是使用df["date"].dt.strftime('%Y-%m')
来改变日期时间的格式,但这样做只会将日期时间转换为字符串类型。然后,再使用pd.to_datetime()
将字符串类型的日期时间转回到datetime64
格式。然而,这个过程中会导致日期值本身发生改变。
举个例子,假设原始日期时间的值是“November 26, 2019”。使用df["date"].dt.strftime('%Y-%m')
将其转换为字符串类型,结果将是字符串"2019-11"。然后,使用pd.to_datetime()
将这个字符串转回datetime64
格式,但此时日期值变成了“November 1, 2019”。所以结果是:格式没有改变,但日期值本身发生了改变。
为了避免这个问题,我们需要在执行df["date"].dt.strftime('%Y-%m')
之前,确保df["date"]
的类型是datetime64
。
下面是解决这个问题的代码:
df['date'] = pd.to_datetime(df["date"].dt.strftime('%Y-%m'))
总结一下,我们在使用Pandas改变日期时间格式时需要注意的问题是:
- 确保日期时间的类型是datetime64
,否则格式转换可能会导致日期值的改变。
- 注意strftime()
函数的使用,它是将日期时间转换为字符串的函数,而不是改变日期时间格式的函数。
希望这篇文章对你在Pandas中改变日期时间格式的操作有所帮助!
在Pandas中,如果需要将日期时间格式更改为其他格式,可以使用`dt.strftime`函数。但是需要注意的是,这样做会将列的数据类型更改为`object`(即字符串)。
首先,我们导入Pandas库并创建一个包含日期字符串的DataFrame:
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
然后,我们使用`pd.to_datetime`函数将日期字符串转换为日期时间格式:
df['DOB'] = pd.to_datetime(df.DOB) print(df)
输出结果为:
DOB 0 2016-01-26 1 2016-01-26
接下来,我们使用`dt.strftime`函数将日期时间格式转换为指定的格式(例如'%m/%d/%Y')并将其存储在新的列`DOB1`中:
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
然而,由于`strftime`函数将日期时间列转换为Unicode字符串,因此如果我们想在`DOB1`上执行其他操作,我们需要将其再次转换为日期时间格式。这样做会导致数据类型的转换。那么有没有其他方法可以格式化而不丢失数据类型呢?
可以在Stack Overflow的讨论中继续这个讨论。