パンダのcsvリーダーが間違った結果を生成する

2020-03-30 pandas

間違った日付形式を生成するpythonスクリプトがあります。

import csv
import urllib
import requests
import numpy as np
from urllib.request import urlopen
from matplotlib.dates import DateFormatter
import matplotlib.pyplot as plt 
import pandas as pd
import io

link = 'https://health-infobase.canada.ca/src/data/covidLive/covid19.csv'
s = requests.get(link).content
coviddata = pd.read_csv(io.StringIO(s.decode('utf-8')),
                        parse_dates=['date'],
                        index_col= ['date'],
                        na_values=['999.99'])
prinput = 'Quebec'
ispr = coviddata['prname'] == prinput
covidpr = coviddata[ispr]
print(covidpr)

それが生成するデータは、以下に示すように日付を改ざんしているようです。

        pruid  prname prnameFR  ...  numtotal  numtoday  numtested

日付... 2020-01-03 24ケベックケベック... 1 1 NaN 2020-03-03 24ケベックケベック... 1 0 NaN 2020-05-03 24ケベックケベック... 2 1 NaN 2020-06-03 24ケベックケベック... 2 0 NaN 2020-07-03 24ケベックケベック... 2 0 NaN 2020-08-03 24ケベックケベック... 3 1 NaN 2020-09-03 24ケベックケベック... 4 1 NaN 2020-11-03 24ケベックケベック... 7 3 NaN 2020-12-03 24ケベックケベック... 13 6 NaN 2020-03-13 24ケベックケベック... 17 4 NaN 2020-03-14 24ケベックケベック... 17 0 NaN

今では逆に これは動作する別のコードスニペットです。

import csv
import urllib
import requests
from urllib.request import urlopen
from matplotlib.dates import DateFormatter
import matplotlib.pyplot as plt 
from datetime import datetime
link = 'https://health-infobase.canada.ca/src/data/covidLive/covid19.csv'

text = requests.get(link).text
lines = text.splitlines()
infile = csv.DictReader(lines)
prinput = input("Enter province(EN):")
xvalues=[]
yvalues=[]
for row in infile:
    if(row['prname']==prinput):
    xvalues.append(row['date'])
    yvalues.append(row['numconf'])
    print(row['prname'],row['date'],row['numconf'])

適切な日付を生成します ケベック01-03-2020 1 ケベック2020年3月3日1 ケベック州05-03-2020 2 ケベック2020年6月3日2 ケベック2020年7月3日2 ケベック08-03-2020 3 ケベック09-03-2020 4 ケベック11-03-2020 7 ケベック12-03-2020 13 ケベック13-03-2020 17 ケベック14-03-2020 17 ケベック15-03-2020 24 ケベック16-03-2020 39 ケベック17-03-2020 50

最初のスクリプトの何が問題になっていますか?

Answers

parse_dates属性を使用したため、 parse_datesは 'date'列を日時オブジェクトとして解釈します。これは、時間の経過に伴うデータのプロットや、指定された期間のデータの再サンプリングに非常に役立ちます。データセットの印刷用に日時形式を再構築する場合は、日時シリーズのdt.strftime属性を使用して再構築できます。 すなわち

# Import pandas
import pandas as pd

# Read in dataframe from url
covid_df = pd.read_csv("https://health-infobase.canada.ca/src/data/covidLive/covid19.csv", 
                       parse_dates=['date'], na_values=[999.99])

# Create new column date-str that's the string interpretation of the 'date' column
covid_df['date-str'] = covid_df['date'].dt.strftime("%d-%m-%Y")

# Show the top of the dataframe
covid_df.head()
"""
   pruid            prname              prnameFR       date  ...  numtotal  numtoday  numtested    date-str
0     35           Ontario               Ontario 2020-01-31  ...         3         3        NaN  31-01-2020
1     59  British Columbia  Colombie-Britannique 2020-01-31  ...         1         1        NaN  31-01-2020
2      1            Canada                Canada 2020-01-31  ...         4         4        NaN  31-01-2020
3     35           Ontario               Ontario 2020-08-02  ...         3         0        NaN  02-08-2020
4     59  British Columbia  Colombie-Britannique 2020-08-02  ...         4         3        NaN  02-08-2020
"""

# Show dtypes and properties of each column of the dataframe
covid_df.info()
"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 302 entries, 0 to 301
Data columns (total 11 columns):
 #   Column     Non-Null Count  Dtype         
---  ------     --------------  -----         
 0   pruid      302 non-null    int64         
 1   prname     302 non-null    object        
 2   prnameFR   302 non-null    object        
 3   date       302 non-null    datetime64[ns]
 4   numconf    302 non-null    int64         
 5   numprob    302 non-null    int64         
 6   numdeaths  302 non-null    int64         
 7   numtotal   302 non-null    int64         
 8   numtoday   302 non-null    int64         
 9   numtested  0 non-null      float64       
 10  date-str   302 non-null    object        
dtypes: datetime64[ns](1), float64(1), int64(6), object(3)
memory usage: 26.1+ KB
"""

Related