![](/img/trans.png)
[英]How to Calculate Age from Date Of Birth in pandas, Python(Jupyter Notebook)
[英]How to calculate age based on date in python pandas? Data types errors
我有一個* .csv文件,格式如下:
ID Date (YYYY-MM-DD)
我需要計算每個人的年齡,但是我找不到辦法。 我試圖使用讀取日期列
parse_dates=['date']
但這沒用。
然后,我嘗試添加帶有實際日期的列並減去兩者,但出現列類型錯誤,並且無法將兩者都解析為數字。 我嘗試了pd.to_numeric(...,errors='coerce')
但是當我應用dtype函數時,它不返回數字。
當我開始使用Pandas時,我感到很沮喪,這對我以前使用的軟件來說是一件很容易的事,但我不知道該怎么做。 任何幫助將非常感激。
除非發布您的csv或創建數據框的代碼,否則將很難回答。 您可能會在鏈接中找到解決日期差異問題的可能方法。
df
A B
one 2014-01-01 2014-02-28
two 2014-02-03 2014-03-01
假設這些是datetime列(如果它們不適用於to_datetime
),則可以減去它們:
df['A'] = pd.to_datetime(df['A'])
df['B'] = pd.to_datetime(df['B'])
In [11]: df.dtypes # if already datetime64 you don't need to use to_datetime
Out[11]:
A datetime64[ns]
B datetime64[ns]
dtype: object
In [12]: df['A'] - df['B']
Out[12]:
one -58 days
two -26 days
dtype: timedelta64[ns]
In [13]: df['C'] = df['A'] - df['B']
In [14]: df
Out[14]:
A B C
one 2014-01-01 2014-02-28 -58 days
two 2014-02-03 2014-03-01 -26 days
如果應用選項解析,則將獲得一個Timestamp()對象。 一種可能的選擇是將日期轉換為str並以這種格式進行操作,在pandas數據框中創建一個新列,例如:
>>> for i in df['you_datetime_column'].iteritems():
...: date_ref = i[1]
...: # your operation
...: df['edad']=result
>>> date_ref
Timestamp('2017-01-09 11:42:05') # date of the last row
>>> date_ref = stt(date_ref)
'2017-01-09 11:42:05'
>>> date_ref=str(date_ref.split([0]))
>>> date_ref
'2017-01-09'
讓我們繼續計算年齡...
>>> from datetime import date
>>> def diferencia(date1,date2):
d1 = date(int(date1[0:4]),int(date1[5:7]),int(date1[-2:]))
d2 = date(int(date2[0:4]),int(date2[5:7]),int(date2[-2:]))
dif = d2 - d1
return str(round(dif.days/365.0,1))+' years'
>>> from datetime import datetime
>>> now=datetime.now().date()
>>> now
datetime.date(2018, 4, 9)
>>> now = str(now)
>>> now
'2018-04-09'
>>> diferencia(time_ref,now)
'1.2 years'
>>> diff = float(diferencia(k,l).split()[0])
>>> diff
1.2
>>> type(float)
float
這是一個分步示例。
您尚未提供邏輯。 為了幫助我們調試您的問題,您應該向我們展示您的數據和代碼 。
import pandas as pd
from io import StringIO
mystr = StringIO("""ID Date
1 2000-02-03
2 1990-06-30
3 1995-05-12
4 1985-12-31
""")
# replace mystr with 'file.csv'
df = pd.read_csv(mystr, delim_whitespace=True, parse_dates=['Date'])
print(df.dtypes)
# ID int64
# Date datetime64[ns]
# dtype: object
df['Age'] = pd.to_datetime('now') - df['Date']
print(df)
# ID Date Age
# 0 1 2000-02-03 6640 days 09:32:54
# 1 2 1990-06-30 10145 days 09:32:54
# 2 3 1995-05-12 8368 days 09:32:54
# 3 4 1985-12-31 11787 days 09:32:54
df['Age'] = df['Age'] / np.timedelta64(1, 'Y')
print(df)
# ID Date Age
# 0 1 2000-02-03 18.180796
# 1 2 1990-06-30 27.777160
# 2 3 1995-05-12 22.911899
# 3 4 1985-12-31 32.272803
由於年齡可能是某個日期時間起的天數,某個日期時間起的秒數或某個日期時間起的年數,並且您不清楚年齡是什么意思,因此假設您想要的是天數,並且不失一般性,假設您的開始日期是字符串'2010-3-13'
。 這是我的計算方法。 主要思想是將string
'2010-3-13'轉換為datetime對象,以便可以從今天的日期中減去它。
from datetime import datetime
numDays = (datetime.now() - datetime.strptime('2010-3-11', '%Y-%m-%d')).days
# the date of this post is '2018-10-3'
如果要打印天數,我可以這樣做:
>>> numDays
[out] 3128
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.