簡體   English   中英

如何基於python pandas中的日期計算年齡? 數據類型錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM