【问题标题】:Pandas: How to convert integer born date to age熊猫:如何将整数出生日期转换为年龄
【发布时间】:2021-11-09 01:45:35
【问题描述】:

我有一个df,你可以通过运行这段代码来获得它:

import pandas as pd
from io import StringIO

dfs = """
BornDate
2   19850100
3   19000100
5   19850100
6   19000100
7   19820100
8   19850100
9   19000100
10  19790100
11  19850100

"""

df = pd.read_csv(StringIO(dfs.strip()), sep='\s+', 
                  dtype={"BornDate": int})
df

输出是:

BornDate
2   19850100
3   19000100
5   19850100
6   19000100
7   19820100
8   19850100
9   19000100
10  19790100
11  19850100

我需要将BornDate 转换为基于变量ValuationDate 的年龄, 年龄等于ValuationDate 减去BornDate

ValuationDate = 20201231
ValuationDate=pd.to_datetime(ValuationDate)
df['BornDate']=pd.to_datetime(df['BornDate'])

df['BornDate']=ValuationDate-df['BornDate']

df['BornDate']

但它会返回:

2    00:00:00.000351
3    00:00:00.001201
5    00:00:00.000351
6    00:00:00.001201
7    00:00:00.000381
8    00:00:00.000351
9    00:00:00.001201
10   00:00:00.000411
11   00:00:00.000351
Name: BornDate, dtype: timedelta64[ns]

输出应该是:

2    35.1
3    12.01
5    35.1
6    120.1
7    38.1
8    35.1
9    120.1
10   41.1
11   35.1

【问题讨论】:

  • 为什么您的示例数据中没有天数 - 即,为什么天数为零且不大于或等于 1? 19850100
  • 对于记录 3 和 6/9,我不明白它们为什么不同:12.01 还是 120.1?
  • @Corralien 抱歉,这是一个错误。谢谢你的回答。

标签: python pandas dataframe numpy datetime


【解决方案1】:

假设您的列BornDate 的格式与YYYYmmdd 中的ValuationDate 格式相同,那么您应该按照以下方式更改代码以适应这种日期字符串格式:

ValuationDate = 20201231
ValuationDate=pd.to_datetime(ValuationDate, format='%Y%m%d')
df['BornDate']=pd.to_datetime(df['BornDate'], format='%Y%m%d')

df['BornDate'] = (ValuationDate - df['BornDate']) / np.timedelta64(1, 'Y')

数据输入

将每个日期的天数由无效的00修改为01

    BornDate
2   19850101
3   19000101
5   19850101
6   19000101
7   19820101
8   19850101
9   19000101
10  19790101
11  19850101

输出

      BornDate
2    35.998001
3   120.999062
5    35.998001
6   120.999062
7    38.998747
8    35.998001
9   120.999062
10   41.999493
11   35.998001

【讨论】:

    【解决方案2】:

    使用dt.microseconds:

    >>> df['BornDate'].dt.microseconds.div(10)
    2      35.1
    3     120.1
    5      35.1
    6     120.1
    7      38.1
    8      35.1
    9     120.1
    10     41.1
    11     35.1
    Name: BornDate, dtype: float64
    

    【讨论】:

    • @William。我不明白您选择接受其他答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2023-03-05
    • 2017-03-05
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多