【问题标题】:Dataframe column str to Dataframe column date数据框列 str 到数据框列日期
【发布时间】:2018-01-25 18:51:56
【问题描述】:

我有一个数据框 column1 dtype obj,格式为:==> 这是数据框的一列

Col1
02.11.2017
11.11.2017
02.12.2017
25.12.2017

我想通过向 df 添加一个新列来将此列转换为日期列:==> 这是将数据框 col1 转换为新的 df 列 NewDate 的代码,会产生以下错误

df['NewDate'] = pd.to_datetime(df['Col1'], format='%d.%m.%Y')

我希望我的结果是:==> 这就是我希望我的结果看起来的样子。

Col1          NewDate
02.11.2017    2017-11-02
11.11.2017    2017-11-11
02.12.2017    2017-12-02
25.12.2017    2017-12-25

但我的错误是:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

但是当我尝试这个时,我仍然得到同样的错误:==>这是我尝试的代码,因为上面的警告/错误但是这样做得到了同样的警告/错误

df.loc[:, 'NewDate'] = pd.to_datetime(df['Col1'].values, format='%d.%m.%Y')

有人能指出我正确的方向吗?任何帮助都非常感谢! PS:对 python 和 pandas 很陌生。

非常感谢!

【问题讨论】:

标签: python python-3.x pandas dataframe python-3.6


【解决方案1】:

这似乎不切实际,但这应该可以帮助您避免警告:

df['NewDate'] = df.loc[:, 'Col1'].apply(lambda x: pd.to_datetime(x, format='%d.%m.%Y'))

【讨论】:

  • 您好!我试过这段代码仍然给我警告/错误
  • 你能试试编辑吗,以前的版本我从来没有警告过,但是这个应该这样做。
  • 不走运:(我的熊猫版本是:0.21.0 whats urs?
  • 所以这不是问题所在。 :/我没有想法。
【解决方案2】:

cmets中提到的解决方案是正确的。我认为您的问题在于不使用copy。请看下面的例子。

如果您有一个原始数据框 df,然后过滤并获取它的子集 df2。您应该使用copy 正确复制值。

In [8]: df
Out[8]: 
     Col1    NewDate
0  02.11.2017 2017-11-02
1  11.11.2017 2017-11-11 
2  02.12.2017 2017-12-02
3  25.12.2017 2017-12-25

In [9]: df2 = df.head(2)

In [10]: df2.loc[:, 'NewDate'] = pd.to_datetime(df2['Col1'].values, 
         format='%d.%m.%Y')
         /home/ks/miniconda2/envs/citius/lib/python2.7/site-
         packages/pandas/core/indexing.py:476: SettingWithCopyWarning: 

         A value is trying to be set on a copy of a slice from a 
        DataFrame.
        Try using .loc[row_indexer,col_indexer] = value instead

        See the caveats in the documentation: 
        http://pandas.pydata.org/pandas 
        docs/stable/indexing.html#indexing-view-versus-copy
        self.obj[item] = s

In [11]: df2 = df.head(2).copy()

In [12]: df2.loc[:, 'NewDate'] = pd.to_datetime(df2['Col1'].values, format='%d.%m.%Y')

编辑:

如果您没有进行任何chaining 操作并且只想关闭此警告,请添加以下行

pd.options.mode.chained_assignment = None

【讨论】:

  • 谢谢!但如果 NewDate 列在另一个 df2 上,它不会帮助我。我想在 Col1 所在的位置添加一个新的数据框 col NewDate,而不是使用 NewDate 列创建一个新的 df2
  • 实际上您的 sn-p df2.loc[:, 'NewDate'] = pd.to_datetime(df2['Col1'].values, format='%d.%m.%Y') 没有任何问题复制。
  • 我试过:df2.loc[:, 'NewDate'] = pd.to_datetime(df2['Col1'].values, format='%d.%m.%Y') AND df2 .loc[:, 'NewDate'] = pd.to_datetime(df2['Col1'].copy(), format='%d.%m.%Y') 似乎没有任何效果
  • 首先告诉我这是您在此数据帧上执行的第一个操作还是之前对其进行切片?
  • 如果在 DF 中选择一个称为切片的列,那么我就是。我有一个带有列的 DF,其中一列的值是:“02.11.2017”,我想用 datetime dtype 将其转换为 DF 中的新列。这就是我想做的。
猜你喜欢
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多