1

自動生成された CSV レポートにいくつかの調整を加えています。私は現在、患者の生年月日を取り、それを月と年の年齢に変換する必要がある部分で立ち往生しています。元の CSV には既に年齢の列があり、DOB 列のデータを変換して Age in Days を見つける方法を見つけましたが、それを月/年に変換できるようにする必要があります。また、その計算値を取得して、現在のフィールドの値を置き換えます。現在のフィールドは、実際の一貫したフォーマットを持たない手書きの文字列です。実際の CSV には約 1700 行と 18 列があり、標準のコンマを使用してそれらを区切っているため、例として短い形式を作成し、見やすくするためにインデントを使用しています。

Last_Name   First_Name   MI   age                 DOB          SSN         visit_date
Stalone     Frank        P    62yrs 10 months     07-30-1950   123456789   05-02-2013
Astley      Richard      P    47years3mo          02-06-1966   987654321   05-03-2013

私が欲しいものは次のようになります:

Last_Name   First_Name   MI   Age       DOB          SSN
Stalone     Frank        P    62y10mo   07-30-1950   123456789
Astley      Richard      P    47y3mo    02-06-1966   987654321

編集: date.year と date.month を使用して年と月を減算できることに気付き、これらの値を見つけやすくしました。私は今自分のコードを編集しており、動作するようになったら更新しますが、質問の2番目の部分でまだ問題があります。

これまでの私のコード:

import re
import csv
import datetime

with open(inputfile.csv','r') as fin, open(outputfile.csv','w') as fout:
   reader = csv.DictReader(fin)
   fieldnames = reader.fieldnames
   writer_clinics = csv.DictWriter(fout, fieldnames, dialect="excel")
   writer_clinics.writeheader()

   for row in reader:
    data = next(reader)
    today = datetime.date.today()
    DOB = datetime.datetime.strptime(data["DOB"], "%m/%d/%Y").date()
age_y = (today.year - DOB.year)
age_m = (today.month - DOB.month)

if age_m < 0:
    age_y = age_y - 1
    age_m = age_m + 12

age = str(age_y) + " y " + str(age_m) + " mo "
print (age)

それで、年齢をoutputfile.csvの正しいフィールドに書き込む方法を見つけようとしていますか?

更新 2: ほとんどの書き込みを行うことができましたが、入力ファイルの特定のフィールドが空のままであるというエラーが発生しています。私の上司はまた、彼が実際に任命した日付に応じて、私に年齢を記入することを望んでいました. 私の現在のコードの塊:

import re
import csv
import datetime

def getage(visit, dob):
    years = visit.year - dob.year
    months = visit.month - dob.month
    if visit.day < dob.day:
        months -= 1
    if months < 0:
        months += 12
        years -= 1
    return '%sy%smo'% (years, months)

with open('inputfile.csv','r') as fin, open('outputfile.csv','w') as fout:
    reader = csv.DictReader(fin)
    writer_clinics = csv.DictWriter(fout, reader.fieldnames, dialect="excel")
    writer_clinics.writeheader()

    for data in reader:
        visit_date = datetime.strptime(data["visit_date"], "%m-%d-%Y").date()
        DOB = datetime.datetime.strptime(data["DOB"], "%m-%d-%Y").date()
        data["Age"] = getage(visit_date, DOB)
        writer_clinics.writerow(data)
4

3 に答える 3

4

年と月では日数が異なるため、日を年と月に変換することはできません。年と月の違い自体を取る必要があります。

dob = datetime.datetime.strptime('07-30-1950', '%m-%d-%Y')
now = datetime.datetime.now()
years = now.year - dob.year
months = now.month - dob.month
if now.day < dob.day:
    months -= 1
while months < 0:
    months += 12
    years -= 1
age = '{}y{}mo'.format(years, months)

>>> print age
62y9mo
于 2013-05-17T17:15:15.160 に答える
0

eGenix DateTimeパッケージを試しましたか?:

>>> import mx.DateTime as dt
>>> a = dt.DateTime(2000, 1, 1)
>>> b = dt.DateTime(2013, 6, 17)
>>> x = dt.Age(b, a)
>>> x.years
13
>>> x.months
5  
于 2013-05-17T17:01:24.430 に答える