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

时间:2018-08-26 14:09:30

标签: python python-3.x pandas datetime series

我只是在自己学习熊猫,我遇到了一些问题。

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

  2. 我已将该列的一部分转换为datetime dtype,它的格式为YYYY-mm-dd。我可以保留datetime dtype并将格式更改为'%m/%d/%Y'吗?我使用过pd.dt.strftime(),它将更改格式,但还将dtype更改为str,而不保留datetime dtype。

1 个答案:

答案 0 :(得分:2)

  

因此,当我使用pd.to_datetime()时,它引发了一些错误,例如格式不   匹配且不符合时间要求的数据。如何统一此格式   专栏?

使用errors='coerce'选项为未转换的值返回NaT(不是时间)。还要注意,format参数不是必需的。省略它会使熊猫尝试多种格式,否则它将恢复为NaT 1 。例如:

df['datetime'] = pd.to_datetime(df['datetime'], errors='coerce')

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

  

我可以保留datetime dtype,并将格式更改为'%m /%d /%Y'吗?

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

formatted_dates = df['datetime'].dt.strftime('%m/%d/%Y')

dtype中的formatted_dates将是object,这表明您系列的元素指向任意Python时间。在这种情况下,那些任意类型碰巧都是字符串。

最后,我强烈建议您不要datetime系列转换为字符串,直到工作流程的最后一步。这是因为,一旦您这样做,您将不再能够在这样的系列上使用高效的矢量化运算。


1 这会牺牲性能并与datetime.strptime需要要指定的格式)形成对比。在内部,Pandas使用dateutil库,如docs所示。