首页 > 解决方案 > 创建新列时日期转换不起作用

问题描述

我想要做的是将我的日期转换为 datetime64[D]。在源 - 一些日期是对象类型,一些日期是 datetime64[ns]。我不是在问如何进行转换——我知道。但是当我创建一个新列时发生了一些事情,以下代码似乎没有影响,并且 datetime64[ns] 没有改变。

 df2['date'].values.astype('datetime64[D]')

这是示例数据框:

d = {'date' :['2015-10-05 15:08:43', '2015-10-05 19:17:12', '2015-10-06 15:51:22', '2015-10-06 19:39:18', '2015-10-06 19:58:06', '2015-12-18 11:09:01'], 'name': ['john', 'tom', 'phill', 'nero', 'bob', 'rob']}
df2 = pd.DataFrame(data = d)

df2 中的日期是对象类型。当我们执行以下操作时

df2['date'] = pd.to_datetime(df2['date'])

日期变为 dtype:datetime64[ns]。

现在下面的代码工作并产生 datetime64[D] 输出

df2['date'].values.astype('datetime64[D]')

但是当我创建一个新列时,它会回到

df2['date'] = df2['date'].values.astype('datetime64[D]')

在此处查看输出 -

名称:日期,数据类型:datetime64[ns]

所以,我的问题是,为什么当我创建一个新列时它不起作用?

注意:我知道最后一行会产生警告。所以我也尝试了下面的方法,但它没有产生 datetime64[D]

newcol = df2['date'].values.astype('datetime64[D]')
df2.assign(date = newcol)

标签: pythonpython-3.xpandasdataframedatetime

解决方案


Pandas 开发人员 Jeff Reback在 2014 年写了以下内容(我认为它仍然存在)

我们不允许直接转换,因为它太复杂了,无法在内部保留除 datetime64[ns] 以外的任何内容(根本没有必要)。它可以完成,但不是很有用恕我直言。

这目前还没有实现,但做起来很简单。

因此,可能无法将数据框列设置为datetime64[D],仅作为datetime64[ns]

如果需要该列,则使用该列返回该列的 Numpy 表示.values并使用它,如下所示

dates = df['date'].values.astype('datetime64[D]') 

推荐阅读