以月为单位计算年龄 - 优化大熊猫的日期转换

时间:2017-05-05 12:33:27

标签: pandas datetime

我正在尝试一个非常简单的事情 - 计算两列之间的月份,并将其保存到新列

df['AGE'] = (df.apply(lambda x: (x['DAX'].year - int(x['BIRTH_DATE'][:4])) * 12 +
                                     x['DAX'].month - int(x['BIRTH_DATE'][5:7])
                                     if x['BIRTH_DATE'] is not None
                                         and int(x['BIRTH_DATE'][:4]) > 1900
                                     else -1                 # data quality
                          , axis=1).astype(np.int8))

我在加载一个非常大的2Gb csv文件时这样做。 DAX直接在阅读器中解析,而BIRTH_DATE保留为字符串。

这个简单的计算将加载时间增加了x10倍。有没有更智能的方法来计算大数据框架上的月龄?

以下是数据样本:

DAX         BIRTH_DATE    
2015-01-01  1931-12-03  
2015-01-01  1991-04-19
2015-01-01  1992-10-11
2015-01-01  1982-05-20
2015-01-01  1987-12-20
2015-01-01  1976-07-30
2015-01-01  1951-05-11
2015-01-01  1993-05-06
2015-01-01  1989-02-27

我正在努力争取另一个专栏' AGE'自生日以来的几个月。

2 个答案:

答案 0 :(得分:0)

由于您没有提供任何样本数据,我不能完全确定您的数据格式是什么。这样的东西应该可以使用,并且比使用apply()快得多:

df['AGE'] = (df.DAX - df.BIRTH_DATE.astype('datetime64[ns]')).dt.days / 30

再次没有数据我不确定你的数据质量步骤需要做什么,但它可能会在上面的行之后修复如下:

df.loc[df['AGE'].isnull(), 'AGE'] = -1

答案 1 :(得分:0)

首先将BIRTH_DATE转换为datetime dtype:

In [257]: df['BIRTH_DATE'] = pd.to_datetime(df['BIRTH_DATE'], errors='coerce')

检查:

In [258]: df.dtypes
Out[258]:
DAX           datetime64[ns]
BIRTH_DATE    datetime64[ns]
dtype: object

现在我们可以做这个简单的数学运算:

In [259]: df['AGE'] = df.DAX.dt.year*12 + df.DAX.dt.month - \
                      (df.BIRTH_DATE.dt.year*12 + df.BIRTH_DATE.dt.month)

In [260]: df
Out[260]:
         DAX BIRTH_DATE  AGE
0 2015-01-01 1931-12-03  997
1 2015-01-01 1991-04-19  285
2 2015-01-01 1992-10-11  267
3 2015-01-01 1982-05-20  392
4 2015-01-01 1987-12-20  325
5 2015-01-01 1976-07-30  462
6 2015-01-01 1951-05-11  764
7 2015-01-01 1993-05-06  260
8 2015-01-01 1989-02-27  311