<p/>
<h3>为最小的示例兼容性而编辑</h3>
<p>您可以定义一个函数来计算一个人的年龄:</p>
<pre><code>from datetime import date
def calc_age(row):
bm = row['bornMonth']
bd = row['bornDay']
by = row['bornYear']
dm = row['diedMonth']
dd = row['diedDay']
dy = row['diedYear']
birth_date = date(*[int(i) for i in (by, bm, bd)]) # suppose that all the parameters is not None
try:
end_date = date(*[int(i) for i in (dy, dm, dd)])
except (TypeError, ValueError): # if death date is None
end_date = date.today()
# is birth date after death date or today; if True == 1, else == 0
is_next_year = ((end_date.month, end_date.day) < (birth_date.month, birth_date.day))
age = end_date.year - birth_date.year - is_next_year
return age
</code></pre>
<p>将此函数沿行应用于数据框:</p>
<pre><code>df.apply(calc_age, axis=1)
</code></pre>
<p>它又回来了pd系列如果没有遗漏数据,所有人的年龄以年为单位。您可以将其连接到数据帧:</p>
<pre><code>df['personsAge'] = df.apply(calc_age, axis=1)
</code></pre>
<p>然后添加另一个状态栏并打印结果:</p>
<pre><code>def is_dead(row):
dm = row['diedMonth']
dd = row['diedDay']
dy = row['diedYear']
try:
died = date(*[int(i) for i in (dy, dm, dd)])
return True
except ValueError:
return False
df['is_dead'] = df.apply(is_dead, axis=1)
def print_status(row):
bm = row['bornMonth']
bd = row['bornDay']
by = row['bornYear']
dm = row['diedMonth']
dd = row['diedDay']
dy = row['diedYear']
age = row['personsAge']
print("DOB: "+str(bm)+"/"+str(bd)+"/"+str(by)+" ("+str(age)+" years old)")
if row['is_dead']:
print("*DECEASED: "+str(dm)+"/"+str(dd)+"/"+str(dy))
df.apply(print_status, axis=1)
stdout:
DOB: 8/17/1932 (47 years old)
*DECEASED: 3/22/1980
DOB: 4/12/1950 (68 years old)
</code></pre>
<p>如果您不喜欢复制粘贴日期选择,请将其替换为来自<a href="https://stackoverflow.com/users/4557382/andrey-portnoy">Andrey Portnoy's</a>解决方案的<code>datetime</code>方法。你知道吗</p>