0ni*_*nir 4 python ipython python-2.7 python-3.x pandas
我有一个带有2列的数据帧df,如下所示 -
START_DATE MONTHS
0 2015-03-21 240
1 2015-03-21 240
2 2015-03-21 240
3 2015-03-21 240
4 2015-03-21 240
5 2015-01-01 120
6 2017-01-01 240
7 NaN NaN
8 NaN NaN
9 NaN NaN
Run Code Online (Sandbox Code Playgroud)
2列的数据类型是对象.
>>> df.dtypes
START_DATE object
MONTHS object
dtype: object
Run Code Online (Sandbox Code Playgroud)
现在,我想通过添加df ['START_DATE']和df ['MONTHS']来创建一个新列"结果".所以,我做了以下 -
from dateutil.relativedelta import relativedelta
df['START_DATE'] = pd.to_datetime(df['START_DATE'])
df['MONTHS'] = df['MONTHS'].astype(float)
df['offset'] = df['MONTHS'].apply(lambda x: relativedelta(months=x))
df['Result'] = df['START_DATE'] + df['offset']
Run Code Online (Sandbox Code Playgroud)
在这里,我得到以下错误 -
TypeError: incompatible type [object] for a datetime/timedelta operation
Run Code Online (Sandbox Code Playgroud)
注意:想要将df ['Months']转换为int,但由于该字段具有Null而无法工作.
能不能给我一些指示.谢谢.
这是一种执行此操作的矢量化方式,因此应该非常高效.请注意,它不处理月份交叉/结尾(并且不能很好地处理DST更改.我相信这就是您获得时间的原因).
In [32]: df['START_DATE'] + df['MONTHS'].values.astype("timedelta64[M]")
Out[32]:
0 2035-03-20 20:24:00
1 2035-03-20 20:24:00
2 2035-03-20 20:24:00
3 2035-03-20 20:24:00
4 2035-03-20 20:24:00
5 2024-12-31 10:12:00
6 2036-12-31 20:24:00
7 NaT
8 NaT
9 NaT
Name: START_DATE, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)
如果您需要精确的MonthEnd/Begin处理,这是一种合适的方法.(使用MonthsOffset获取同一天)
In [33]: df.dropna().apply(lambda x: x['START_DATE'] + pd.offsets.MonthEnd(x['MONTHS']), axis=1)
Out[33]:
0 2035-02-28
1 2035-02-28
2 2035-02-28
3 2035-02-28
4 2035-02-28
5 2024-12-31
6 2036-12-31
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)