将日期时间转换为另一种格式而不更改 dtype

Map*_* Yu 5 python datetime series python-3.x pandas

我自己刚刚学习 Pandas,遇到了一些问题。

  1. 在从 csv 文件读取的 DataFrame 中,我有一列包含不同格式的日期数据(例如'%m/%d/%Y''%Y-%m-%d',可能为空白。),我想统一该列的格式。但不知道还有没有其他格式。因此,当我使用时pd.to_datetime(),它引发了一些错误,例如格式不匹配和非仿时数据。如何统一该栏目的格式?

  2. 我已将该列的一部分转换为日期时间数据类型,并且它是YYYY-mm-dd格式的。我可以保留日期时间数据类型,并将格式更改为 吗'%m/%d/%Y'?我已经使用过pd.dt.strftime(),它会更改格式,但也会将 dtype 更改为 str,而不保留 datetime dtype。

jpp*_*jpp 3

因此,当我使用 pd.to_datetime() 时,它引发了一些错误,例如格式不匹配和非类时数据。如何统一该栏目的格式?

使用该errors='coerce'选项可以返回NaT(Not a Time)未转换的值。另请注意,format参数不是必需的。省略它将使 Pandas 能够尝试多种格式,失败时它将恢复为NaT1。例如:

df['datetime'] = pd.to_datetime(df['datetime'], errors='coerce')
Run Code Online (Sandbox Code Playgroud)

请注意,混合类型可能会被错误地解释。例如,Python 如何知道是05/06/20186 月 5 日还是 5 月 6 日?将应用约定的顺序,如果您需要更好的控制,则需要自己应用自定义的顺序。

我可以保留日期时间数据类型,并将格式更改为“%m/%d/%Y”吗?

你不能。datetime系列在内部存储为整数。任何人类可读的日期表示都只是表示,不是底层整数。要访问自定义格式,您可以使用 Pandas 中提供的方法。您甚至可以将这样的文本表示形式存储在pd.Series变量中:

formatted_dates = df['datetime'].dt.strftime('%m/%d/%Y')
Run Code Online (Sandbox Code Playgroud)

of将会是,它dtype表明系列的元素指向任意 Python 时间。在这种情况下,那些任意类型恰好都是字符串。formatted_datesobject

最后,我强烈建议您在工作流程的最后一步之前不要将系列转换为字符串。datetime这是因为一旦您这样做,您将无法再对此类序列使用高效的矢量化操作。


1这会牺牲性能,与datetime.strptime需要指定格式的 相比。在内部,Pandas 使用该dateutil库,如文档中所示。