【问题标题】:dateoffset on dataframe column数据框列上的日期偏移量
【发布时间】:2015-02-06 09:26:09
【问题描述】:

我有一个 Pandas 数据框和一个列 称为具有datetime64[ns] 数据类型的过期。 df.['expiration'][0]Timestamp('2010-12-31 00:00:00')

我想从此列中减去一个日历日,但不知道怎么做。 我试过pandas.tseries.offsets.DateOffset(days=1) 但这给出了错误 不能在 datetime/timedelta 操作中使用非绝对 DateOffset [<DateOffset: kwds={'days': 1}>]

这显然是因为它只适用于 timeindex。 所以我尝试了

import pandas
df['expiration']=df['expiration']-pandas.datetime.timedelta(days=1)

但这会导致另一个错误:

类型对象'datetime.datetime'没有属性'timedelta'

如何以一种可行的方式做到这一点?

【问题讨论】:

    标签: python pandas datetimeoffset


    【解决方案1】:

    你有两个问题。首先 pandas.datetime 是 datetime.datetime 类而不是模块,因此您需要直接引用 datetime.timedelta 类。其次,您需要从列中的每个值中取出 1 天。我会这样做:

    import datetime as dt
    df['expiration'] = df['expiration'].apply(lambda x: x - dt.timedelta(days=1))
    

    要对此进行矢量化,您需要将 timedelta 转换为 numpy.timedelta64:

    df['expiration'] = df['expiration'] - pt.timedeltas.to_timedelta(dt.timedelta(days=1))
    

    或者直接创建numpy.timedelta64:

    df['expiration'] = df['expiration'] - numpy.timedelta64(1, 'D')
    

    【讨论】:

    • 不过,这不是矢量化的。
    • 添加了矢量化解决方案
    • 非常感谢。但是,为什么 dt.timedelta 以迭代方式工作,而不是在矢量化代码行中工作?不过,诸如 df['mycolumn']=df['mycolumn']+2 之类的东西正在起作用。
    • 我的猜测是 datetime.timedelta 和 numpy.timedelta64 之间根本没有类型转换,而 int -> numpy.timedelta64 有类型转换。或者 timedelta64 可能是一个整数类型,因此 numpy 自动转换。它看起来像一个可以添加的功能。
    猜你喜欢
    • 2019-09-27
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多