创建新列时日期转换不起作用

Posted

技术标签:

【中文标题】创建新列时日期转换不起作用【英文标题】:Date conversion doesn't work when creating new column 【发布时间】:2018-11-01 14:58:17 【问题描述】:

我想要做的是将我的日期转换为 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)

【问题讨论】:

我不明白。哪里有恢复到object的东西? 如果你指的是为什么 dtype 是 datetime64[ns] 而不是 datetime64[D] 我发现这个其他有用的 SO 链接 ***.com/questions/31917964/… 日期回到 datetime64[ns] 即使在使用 df2['date'].values.astype('datetime64[D]') @roganjosh 刚刚看到给你的链接。我对此一无所知。熊猫约会时间更有趣:) @Orenshi 我看到了那个链接 - 但没有解决我的问题。 【参考方案1】:

Pandas 开发人员 Jeff Reback,wrote the following in 2014(我认为它仍然存在)

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

这目前尚未实现,但执行起来非常简单。

因此,可能无法将数据框列作为datetime64[D],而只能作为datetime64[ns]

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

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

【讨论】:

以上是关于创建新列时日期转换不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当我们单击网格列(即单击网格列)时,自定义日期排序不起作用

隐藏列时公式小计 109 在 Excel 中不起作用

转换日期用户定义的函数不起作用

.getDay() 在将日期转换为特定时区时不起作用

将纪元时间戳转换为可读日期不起作用

将纪元转换为人类可读的日期在 python 中不起作用