我有一个包含2列的pandas数据框df
:date1
和date2
。我想用2之间的月距离计算一个新的。
如果我这样做:
def meses(d1, d2):
return (d1.year - d2.year)*12 + d1.month - d2.month
df['mora']=meses(df.date1.dt,df.date2.dt)
工作正常,但如果我想减少一个月的情况,那么两个日期的天数差异为负数的情况如下:
def meses(d1, d2):
if (d2.day-d1.day)<0:
resto=1
else:
resto=0
return (d1.year - d2.year)*12 + d1.month - d2.month - resto
df['mora']=meses(df.date1.dt,df.date2.dt)
给了我以下错误:
----&GT; 2 if(d2.day-d1.day)&lt; 0:
ValueError:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
似乎问题在于函数中的if
。我该如何解决?
我的数据框:
date1 date2
2013-08-27 2013-11-07
2013-10-01 2013-12-06
2013-11-01 2014-01-09
2013-11-29 2014-02-05
2013-12-27 2014-03-17
2014-01-31 2014-04-24
我想要一个新的列'mora'与其他2列的月份不同,第一个函数给了我:
df['mora']=meses(df.date2.dt,df.date1.dt)
date1 date2 mora
2013-08-27 2013-11-07 3
2013-10-01 2013-12-06 2
2013-11-01 2014-01-09 2
2013-11-29 2014-02-05 3
2013-12-27 2014-03-17 3
2014-01-31 2014-04-24 3
但如果我使用.day
版本,它会给我错误。
答案 0 :(得分:1)
第一个可行,因为您一次对整个系列执行简单计算,即只减去或添加整个列。第二个不起作用,因为您检查整个序列/值列表是否小于另一个。显然,更有效的方法可以做到这一点,但我保持尽可能接近原始解决方案,请尝试这样做:
import numpy as np
df['mora']=np.where(df.date1.dt.day < df.date2.dt.day, \
(df.date1.dt.year - df.date2.dt.year)*12 + df.date1.dt.month - df.date2.dt.month - 1, \
(df.date1.dt.year - df.date2.dt.year)*12 + df.date1.dt.month - df.date2.dt.month)
答案 1 :(得分:0)
ValueError
提供的消息很明确:
The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
if
子句获取系列d2.day-d1.day
的真值,这是Series
本身。
如果您希望all
行为< 0
,则应使用all
关键字。