如何计算不同熊猫列中两个日期之间的年数

leo*_*fer 4 python datetime dataframe pandas

一列有日期,而另一列有一个包含日期的字符串,所以我首先需要从该字符串中提取日期部分。

import pandas as pd
import datetime
from dateutil.relativedelta import relativedelta

# the dataframe - id column always starts with year, month and day
df = pd.DataFrame({'id': ['19520630F8', '19680321A5', '19711113E2'],
                   'dte': ['2010-06-02', '2007-08-12', '2013-01-23']})

# create a date string from df['id'] to the format yyyy-mm-dd
dob = (df['id'].str[:4] + '-' +
       df['id'].str[4:6] + '-' +
       df['id'].str[6:8])

# calculate age (years only) at df['dte']
df['age'] = relativedelta(date, dob).years
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我不明白我的数据的歧义,以及在哪里应用那些空/布尔/项目......df['dta']对象数据类型而不是日期时间的列if,但将dob的创建包装在pd.to_datetime无济于事。

编辑预期的输出应该是

          dte          id  age
0  2010-06-02  19520630F8   57
1  2007-08-12  19680321A5   39
2  2013-01-23  19711113E2   41
Run Code Online (Sandbox Code Playgroud)

jpp*_*jpp 6

这是一种使用dateutil.relativedelta列表理解的解决方案。datetime重要的一点是在计算中使用它们之前确保有两个系列。

from dateutil.relativedelta import relativedelta

df['id_dte'] = pd.to_datetime(df['id'].str[:8], format='%Y%m%d')
df['dte'] = pd.to_datetime(df['dte'])

df['age'] = [relativedelta(a, b).years for a, b in zip(df['dte'], df['id_dte'])]

print(df)

         dte          id     id_dte  age
0 2010-06-02  19520630F8 1952-06-30   57
1 2007-08-12  19680321A5 1968-03-21   39
2 2013-01-23  19711113E2 1971-11-13   41
Run Code Online (Sandbox Code Playgroud)

但是,如果您只想获取年份之间的差异(而不是从年龄派生),则可以datetime直接使用属性:

df['age'] = df['dte'].dt.year - df['id_dte'].dt.year

print(df)

         dte          id     id_dte  age
0 2010-06-02  19520630F8 1952-06-30   58
1 2007-08-12  19680321A5 1968-03-21   39
2 2013-01-23  19711113E2 1971-11-13   42
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 5

我相信需要:

df['age'] = (np.floor((pd.to_datetime(df['dte']) - 
             pd.to_datetime(dob)).dt.days / 365.25)).astype(int)
print (df)
           id         dte  age
0  19520630F8  2010-06-02   57
1  19680321A5  2007-08-12   39
2  19711113E2  2013-01-23   41
Run Code Online (Sandbox Code Playgroud)

详情

将列转换为日期时间并减去:

print (pd.to_datetime(df['dte']) -  pd.to_datetime(dob))
0   21156 days
1   14388 days
2   15047 days
dtype: timedelta64[ns]
Run Code Online (Sandbox Code Playgroud)

转换为天,然后转换为年:

print ((pd.to_datetime(df['dte']) -  pd.to_datetime(dob)).dt.days / 365.25)
0    57.921971
1    39.392197
2    41.196441
dtype: float64
Run Code Online (Sandbox Code Playgroud)

最后的floor值由numpy.floor.

print ((np.floor((pd.to_datetime(df['dte']) - pd.to_datetime(dob)).dt.days / 365.25)))
0    57.0
1    39.0
2    41.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)