Vaughn
Vaughn

Reputation: 1

How to find the date of min and max outdoor temp and output the min and max to a different csv with the date they occurred?

I am new to python and I am trying to help my son with a school project. He needs to look at a csv with min and max outdoor temperature, and then write to a different CSV with the min temperature and the date that it occurred, and then do the same with the max temp. i.e.

7/4/1996 98
2/15/1921 -25.

I have figured out how to find the min and max and make it write it to a CSV, but I don't know how to get it to tag the min and max with the date that they occurred.

I used code from another post to get me started and made a few tweaks to it to get it to work, but don't know how to get the date with the temps. book.csv is the file with the temperatures and dates. ook.output.csv is the file I am outputting the data to.

Conceptually, I would think that if you could tag the line that the min came from in the CSV, and then use that somehow to make python write it to the same line as it puts the min, that would work. Just don't know how to do that.

import csv

mydelimeter = csv.excel()
mydelimeter.delimiter=","
myfile = open(r"C:\VAF\Cade\book.csv")

myfile.readline()
myreader=csv.reader(myfile,mydelimeter)
mywind,mydate=[],[]
minTemp, maxTemp = [],[]

for row in myreader:
    minTemp.append(row[1])
    maxTemp.append(row[2])

print ("Coldest temperature : ", min(minTemp))
print ("Hottest temperature : ", max(maxTemp))

data = [min(minTemp), max(maxTemp)]

with open("C:\VAF\Cade\ook.output.csv", 'w') as f:
    writer = csv.writer(f)
    writer.writerow(data)

CSV with made up data

CSV with made up data

output CSV with min and max temp

output CSV with min and max temp

Upvotes: 0

Views: 1044

Answers (2)

martineau
martineau

Reputation: 123521

To do what you want, you need to keep track of the dates that had the lowest and highest temperature. An easy way to do that is to remember it when updating the minimum or maximum temperatures that have been seen so far as each row of the file is processed.

Below is code that does this and also shows some better techniques for handling both files in general, and CSV files in particular.

import csv

inpfile = r"book.csv"
outpfile = r"book.output.csv"

my_dialect = csv.excel()
my_dialect.delimiter = ","

with open(inpfile, newline='') as myfile:
    myreader = csv.reader(myfile, my_dialect)
    next(myreader)  # Skip header row.

    row = next(myreader)  # Read first data row.
    # Initialize overall stats with data from it.
    mindate = maxdate = row[0]
    file_mintemp, file_maxtemp = int(row[1]), int(row[2])

    # Process the rest of the rows.
    for row in myreader:
        row_mintemp, row_maxtemp = int(row[1]), int(row[2])
        if row_mintemp < file_mintemp:
            file_mintemp = row_mintemp
            mindate = row[0]
        if row_maxtemp > file_maxtemp:
            file_maxtemp = row_maxtemp
            maxdate = row[0]

print("Coldest temperature: ", file_mintemp)
print("Hottest temperature: ", file_maxtemp)

with open(outpfile, 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow([mindate, file_mintemp])
    writer.writerow([maxdate, file_maxtemp])

print('fini')

Upvotes: 0

MYousefi
MYousefi

Reputation: 1008

Two things to do here.

First, the values read by csv reader are strings not numbers so the min, max functions don't do numerical comparison.

Here's a possible way to read them into numbers:

rows = []
for row in myreader:
    rows.append([row[0], int(row[1]), int(row[2])])

Second, keep the entire row:

min_temp = min(rows, key = lambda x: x[1])
max_temp = max(rows, key = lambda x: x[2])

To write the data to file:

data = [['date', 'temp'], [min_temp[0], min_temp[1]], [max_temp[0], max_temp[2]]]
with open("C:\VAF\Cade\ook.output.csv", 'w') as f:
    writer = csv.writer(f)
    for row in data:
        writer.writerow(row)

Upvotes: 0

Related Questions