不改变数据类型,将日期时间转换为另一种格式

4

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

  1. 在一个DataFrame中,它是从一个csv文件读取的,我有一列包括日期数据,格式不同(如'%m/%d/%Y''%Y-%m-%d',可能为空)。我想统一这一列的格式。但我不知道是否还有其他格式。所以当我使用pd.to_datetime()时,它会引发一些错误,如格式不匹配和非时间数据。如何统一这一列的格式?

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

1个回答

3
当我使用pd.to_datetime()时,会出现格式不匹配和非时间数据的错误。如何统一此列的格式?
可以使用“errors ='coerce'”选项来返回未转换值的NaT(Not a Time)。还要注意,format参数不是必需的。省略它将使Pandas尝试多个格式,如果失败,它将恢复为NaT1。例如:
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')
formatted_datesdtype将为object,这表示您的系列元素指向任意Python时间类型。在这种情况下, 这些任意类型恰好都是字符串。
最后,我强烈建议您在工作流程的最后一步之前不要datetime系列转换为字符串。因为一旦这样做,就无法在此类系列上使用高效的向量化操作。
1 这将牺牲性能,并与需要指定格式的datetime.strptime相对比。在内部,Pandas使用dateutil库,如文档中所示。

谢谢!我知道可以在参数中使用errors='coerce',但这会将所有其他不符合默认输入的输入更改为Nat。例如,如果我有两种格式,如'%m/%d/%Y''%Y-%m-%d',如果我设置format='%m/%d/%Y',另一个将成为Nat,我也希望它转换为统一的格式。是否有可能的解决方案?谢谢! - Maple Yu
@MapleYu,是的,你不需要指定“format”。这不是“pd.to_datetime”的必需参数。例如,“pd.to_datetime(pd.Series(['15/12/2018', '12/15/2018']), errors='coerce')”将被正确读取。 - jpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接