【问题标题】:Column arithmetic in pandas dataframe using dates使用日期的熊猫数据框中的列算术
【发布时间】:2014-08-12 02:29:53
【问题描述】:

我认为这应该很容易,但我有点碰壁了。我有一个从 Stata .dta 文件导入到 pandas 数据框中的数据集。有几列包含日期数据。数据框包含 100,000 多行,但给出了一个示例:

   cat  event_date  total
0   G2  2006-03-08     16
1   G2         NaT    NaN
2   G2         NaT    NaN
3   G3  2006-03-10     16
4   G3  2006-08-04     12
5   G3  2006-12-28     13
6   G3  2007-05-25     10
7   G4  2006-03-10     13
8   G4  2006-08-06     19
9   G4  2006-12-30     16

数据以 datetime64 格式存储:

>>> mydata[['cat','event_date','total']].dtypes
cat                    object
event_date     datetime64[ns]
total                 float64
dtype: object

我想要做的就是创建一个新列,它给出 event_date 和开始日期(例如 2006 年 1 月 1 日)之间的天数差异(而不是“我们”或“ns”!!!)。我尝试了以下方法:

>>> mydata['new'] = mydata['event_date'] - np.datetime64('2006-01-01')

……但我得到了消息:

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

我也尝试过 lambda 函数,但也没有用。

但是,如果我只想在可以成功使用的每个日期上添加一天:

>>> mydata['plusone'] = mydata['event_date'] + np.timedelta64(1,'D')

效果很好。

我在这里遗漏了一些简单的东西吗?

提前感谢您的帮助。

【问题讨论】:

  • 你的问题很奇怪,我无法解释,但以下对我有用:import datetime as dt mydata['new'] = mydata['event_date'] - dt.datetime(2006,1,1)你能确认一下
  • 我在任何情况下都尽量避免直接使用np.datetime64,也就是说,这是一个错误:github.com/pydata/pandas/issues/7996

标签: python pandas dataframe datetime64


【解决方案1】:

不确定为什么 numpy datetime64 与 pandas dtypes 不兼容,但使用 datetime 对象对我来说效果很好:

In [39]:

import datetime as dt
mydata['new'] = mydata['event_date'] - dt.datetime(2006,1,1)
mydata
Out[39]:
      cat event_date  total      new
Index                               
0      G2 2006-03-08     16  66 days
1      G2        NaT    NaN      NaT
2      G2        NaT    NaN      NaT
3      G3 2006-03-10     16  68 days
4      G3 2006-08-04     12 215 days
5      G3 2006-12-28     13 361 days
6      G3 2007-05-25     10 509 days
7      G4 2006-03-10     13  68 days
8      G4 2006-08-06     19 217 days
9      G4 2006-12-30     16 363 days

【讨论】:

  • 完美运行 - 非常感谢!但我还是有点困惑——当日期和时间信息作为 datetime64 存储在 pandas 数据框中时,这不是 numpy 格式吗?如果是这样,为什么 datetime 有效而 datetime64 无效?
  • @user1718097 这让我很困惑,我对此没有答案,希望 Pandas 开发人员之一可以发表评论
  • 刚刚看到 Jeff 的评论,这是一个错误,应该在以后的版本中修复,你也可以投票;)
  • @user1718097 最好将错误直接发布到github.com/pydata/pandas/issues,而不是在这里,如果你知道这是一个有时很难说出来的错误
【解决方案2】:

确保您拥有最新版本的 pandas 和 numpy (>=1.7):

In [11]: df.event_date - pd.Timestamp('2006-01-01')
Out[11]:
0    66 days
1        NaT
2        NaT
3    68 days
4   215 days
5   361 days
6   509 days
7    68 days
8   217 days
9   363 days
Name: event_date, dtype: timedelta64[ns]

【讨论】:

  • 感谢您的信息 - 完美运行。几乎同时使用 dt.datetime() 而不是 pd.Timestamp() 给出了一个非常相似的解决方案。我已将该答案标记为已接受,只是因为我过去更频繁地使用 datetime()。但这个解决方案同样有效。
猜你喜欢
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多