【问题标题】:Using 2 pandas columns as arguments for np.timedelta使用 2 个 pandas 列作为 np.timedelta 的参数
【发布时间】:2014-01-10 03:41:59
【问题描述】:

简单的问题:

In [1]:
df = DataFrame({'value':[4,4,4],'unit':['D','W','Y']})
df

Out[1]:
     unit   value
0    D      4
1    W      4
2    Y      4

我可以通过这种方式创建时间增量(当然):

In [2]:
timedelta64(4, 'D')

Out[2]:
numpy.timedelta64(4,'D')

但我无法遍历 DataFrame 列以获得具有 timedeltas 的结果系列:

def f(x):    
    return timedelta64(x['value'], x['unit'])

df.apply(f, axis=1)

相反,我得到:

TypeError: don't know how to convert scalar number to float

编辑:

这也不起作用,并返回相同的错误:

df['arg'] = zip(df.value, df.unit)
df.arg.apply(lambda x: timedelta64(x[0], x[1]))

【问题讨论】:

  • 您的pandasnumpy 版本是什么?你的代码对我来说似乎工作正常。
  • @TomAugspurger pandas 0.12.0, numpy 1.8.0

标签: python numpy pandas apply


【解决方案1】:

所以你的代码对我有用。

df = pd.DataFrame({'value':[4,4,4],'unit':['D','W','Y']})
df.apply(f, axis=1)
0     4 days
1    4 weeks
2    4 years
dtype: object

这是我的版本:

numpy.__version__
'1.8.0'
pandas.__version__
'0.13.0rc1-32-g81053f9'

我确实注意到了一个可能与您的问题有关的错误。您可以检查您是否有 numpy 1.7,如果有,请升级到 1.8,看看是否可以解决问题。祝你好运:)

https://github.com/pydata/pandas/issues/5689

【讨论】:

    【解决方案2】:

    在 0.13 中,使用新的 pd.to_timedelta 支持这一点:

    In [24]: df = DataFrame({'value':[4,4,4],'unit':['D','W','Y']})
    
    In [25]: pd.to_timedelta(df.apply(lambda x: np.timedelta64(x['value'],x['unit']), axis=1))
    Out[25]: 
    0      4 days, 00:00:00
    1     28 days, 00:00:00
    2   1460 days, 23:16:48
    dtype: timedelta64[ns]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 2022-10-06
      • 2018-12-19
      • 2018-10-08
      相关资源
      最近更新 更多