创建新列

时间:2018-05-22 18:42:50

标签: python python-3.x pandas datetime

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

请参阅此处的输出 -

名称:日期,dtype:datetime64 [ns]

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

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

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

1 个答案:

答案 0 :(得分:0)

Jeff Reback,熊猫开发者,wrote the following in 2014(我认为它仍然存在)

<块引用>

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

这目前没有实现,但很容易做到。

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

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

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