我的 CSV 檔案有三列,第一列名稱,第二列是 DOB(YYYYMM-DD) 第三列是薪水 看起來像這種
Name,DOB,Salary
Sam,2000-01-05,23000
Tyson,1989-09-11,29000
Lara,2002-11-19,19000
Brian,1990-04-20,21000
Tessa,2000-08-17,15000
問題陳述- 讀取檔案并顯示資料并在終端中找到他們的年齡。
因此,我想添加一個名為“年齡”的新列,它會相應地列印他們的年齡。
Name,DOB,Salary,Age
Sam,2000-01-05,23000,22
Tyson,1989-09-11,29000,51
Lara,2002-11-19,19000,20
Brian,1990-04-20,21000,32
Tessa,2000-08-17,15000,22
我做了這樣的事情。
import csv
import datetime
def getage(now, dob):
years = now.year - dob.year
months = now.month - dob.month
if now.day < dob.day:
months -= 1
while months < 0:
months = 12
years -= 1
return '%sy%smo' % (years, months)
with open('emp_details.csv', 'r') as fin, open('emp_details_out.csv', 'w') as fout:
csv_reader = csv.reader(fin)
csv_writer = csv.writer(fout)
for data in csv_reader:
today = datetime.date.today()
DOB = datetime.datetime.strptime(data["DOB"], "%Y-%m-%d").date()
data["Age"] = getage(today, DOB)
csv_writer.writerow(data)
它在下面顯示錯誤的地方
DOB = datetime.datetime.strptime(data["DOB"], "%Y-%m-%d").date()
TypeError: list indices must be integers or slices, not str
我是 csv 檔案的新手,這就是為什么我需要一些幫助,如果這個問題看起來不合適,請考慮一下。我真的需要幫助。
uj5u.com熱心網友回復:
使用pandas可能是最簡單的
import pandas as pd
import datetime
df = pd.read_csv('some/file/path/file_name.csv') # read your csv using the file's path
df['DOB'] = pd.to_datetime(df['DOB']) # convert date to datetime
df['Age'] = (datetime.datetime.now() - df['DOB']).dt.days // 365 # calculate the age
df.to_csv('/some/file/path/file_name.csv', index=False) # create a csv file or update existing
Name DOB Salary Age
0 Sam 2000-01-05 23000 22
1 Tyson 1989-09-11 29000 33
2 Lara 2002-11-19 19000 19
3 Brian 1990-04-20 21000 32
4 Tessa 2000-08-17 15000 22
uj5u.com熱心網友回復:
我還建議在這里使用 pandas,感謝 @It_is_Chris。
如果您想知道為什么您的代碼不起作用,那么您沒有考慮到一些小事情。
csv.reader回傳資料串列的串列。該串列的第一個元素是帶有標題的串列。您不能使用列的標題名稱訪問每行的元素,而是需要通過索引訪問它們。
你也可以使用csv.DictReaderandcsv.DictWriter來解決這個問題。然后您需要使用您使用的語法為每一行(這是一個字典)添加 Age 的鍵值對,例如row['Age']
我沒有更改您的功能中的任何內容getage。
# 1
with open('emp_details.csv', 'r') as fin, open('emp_details_out.csv', 'w') as fout:
csv_reader = csv.reader(fin)
csv_writer = csv.writer(fout)
header = next(csv_reader) ['Age'] # take first row of csv_reader as header and add 'Age'
csv_writer.writerow(header)
for data in csv_reader:
today = datetime.date.today()
DOB = datetime.datetime.strptime(data[1], "%Y-%m-%d").date()
data.append(getage(today, DOB))
csv_writer.writerow(data)
# OR
# 2
with open('emp_details.csv', 'r') as fin, open('emp_details_out.csv', 'w') as fout:
csv_reader = csv.DictReader(fin)
header = [*next(csv_reader).keys()] ['Age']
csv_writer = csv.DictWriter(fout, fieldnames=header)
csv_writer.writeheader()
for data in csv_reader:
today = datetime.date.today()
DOB = datetime.datetime.strptime(data['DOB'], "%Y-%m-%d").date()
data['Age'] = getage(today, DOB)
csv_writer.writerow(data)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/526629.html
