Hey,
wie kann ich die neuste .csv Datei von diesem Link herunterladen? Entschuldigung falls das keine Python Frage ist aber ich kenne mich mit GitHub nicht aus :/
https://github.com/CSSEGISandData/COVID ... ly_reports
Neuste Datei von GitHub herunterladen
Danke.
Habe die CSV Datei jetzt heruntergeladen und in ein DataFrame eingelesen.
Ich möchte nun die Werte für Confirmed, Deaths, Recovered und Active zusammenaddieren, wenn in der Spalte Country_Region das gleiche Land steht. Habe das so versucht aber es klappt nicht.
Hat jemand einen Tipp?
Habe die CSV Datei jetzt heruntergeladen und in ein DataFrame eingelesen.
Code: Alles auswählen
Country_Region Confirmed Deaths Recovered Active
0 US 3 0 0 0
1 US 3 0 0 0
2 US 2 0 0 0
3 US 39 0 0 0
4 US 1 0 0 0
... ... ... ... ... ...
3416 Venezuela 107 0 15 92
3417 Vietnam 153 0 20 133
3418 West Bank and Gaza 84 1 17 66
3419 Zambia 16 0 0 16
3420 Zimbabwe 3 1 0 2
Code: Alles auswählen
df = pd.read_csv(FILENAME, usecols= ["Country_Region", "Confirmed", "Deaths", "Recovered", "Active"])
for column in df.columns.values:
df.groupby("Country_Region")[column].sum()
print(df)
- __blackjack__
- User
- Beiträge: 13117
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Was klappt daran denn nicht? Und warum hast Du da eine Schleife über die Spaltennamen?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Ich habe mal einen Code geschrieben, der das ganze auch ohne die Hilfe von git herunterlädt:
Ist einfacher, als git zu benutzen.
Code: Alles auswählen
from datetime import datetime
import requests
datelist = []
response = requests.get("https://api.github.com/repos/CSSEGISandData/COVID-19/contents/csse_covid_19_data/csse_covid_19_daily_reports").json()
for i in response:
if i["name"].endswith(".csv"):
datelist.append(datetime.strptime(i["name"][:-4],"%m-%d-%Y"))
newest_date = max(datelist)
newest_filename = "%s-%s-%s.csv" % ("{:02d}".format(newest_date.month), "{:02d}".format(newest_date.day), newest_date.year)
csv_data = requests.get("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/" + newest_filename)
with open("downloaded_data.csv","w",encoding="utf-8") as f:
f.write(csv_data.text)
Danke, habe mir aber auch was eigenes gebaut was ich benutze bis ich das mit Git hinbekomme.
Code: Alles auswählen
import urllib.request
from datetime import datetime, timedelta
BASE_URL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/"
FILENAME = "Corona.csv"
def get_latest_csv():
try:
date_today = datetime.strftime(datetime.now(), '%m-%d-%Y')
csv_url = f"{BASE_URL}{date_today}.csv"
urllib.request.urlretrieve(csv_url, FILENAME)
found_csv = True
except urllib.error.HTTPError:
print(f"Die Datei vom {date_today} wurde nicht gefunden.\nEs wird die Datei vom Vortag gesucht.")
found_csv = False
if not found_csv:
try:
date_yesterday = datetime.strftime(datetime.now() - timedelta(1), '%m-%d-%Y')
csv_url = f"{BASE_URL}{date_yesterday}.csv"
urllib.request.urlretrieve(csv_url, FILENAME)
print(f"Datei vom {date_yesterday} gefunden!")
except urllib.error.HTTPError:
print("Keine Daten gefunden")
- __blackjack__
- User
- Beiträge: 13117
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@JakobDev: Grunddatentypen haben in Namen nichts zu suchen.
Man sollte keine Daten im Code wiederholen. Das ist fehleranfällig sowohl beim schreiben, also auch wenn man das mal anpassen möchte. Wobei man die zweite URL in dem Code eigentlich gar nicht braucht, denn die Download-URLs sind in der Antwort der ersten Anfrage mit enthalten.
`i` ist kein guter Name für ein Wörterbuch das Daten zu einer Datei im Repository enthät.
`newest_filename` wird ziemlich umständlich zusammengesetzt. Erst einmal werden da ``%`` und `format()` gemischt wo man doch einfach direkt `format()` für alles verwenden könnte. Und dann kann man gleich das Datum als einen Wert entsprechend formatieren, statt Monat, Tag, und Jahr einzeln.
Aber wie gesagt, die Download-URL ist schon in den Daten der ersten Abfrage enthalten, die muss man sich nicht selbst noch mal zusammenbasteln.
`csv_data` ist mehr als nur die Daten, da ist eine komplette Serverantwort mit Headern enthalten. Und CSV-Daten nur wenn die Abfrage erfolgreich war.
Überarbeitet:
Man sollte keine Daten im Code wiederholen. Das ist fehleranfällig sowohl beim schreiben, also auch wenn man das mal anpassen möchte. Wobei man die zweite URL in dem Code eigentlich gar nicht braucht, denn die Download-URLs sind in der Antwort der ersten Anfrage mit enthalten.
`i` ist kein guter Name für ein Wörterbuch das Daten zu einer Datei im Repository enthät.
`newest_filename` wird ziemlich umständlich zusammengesetzt. Erst einmal werden da ``%`` und `format()` gemischt wo man doch einfach direkt `format()` für alles verwenden könnte. Und dann kann man gleich das Datum als einen Wert entsprechend formatieren, statt Monat, Tag, und Jahr einzeln.
Code: Alles auswählen
newest_filename = "%s-%s-%s.csv" % (
"{:02d}".format(newest_date.month),
"{:02d}".format(newest_date.day),
newest_date.year,
)
# <=>
newest_filename = "{:02d}-{:02d}-{:04d}.csv".format(
newest_date.month, newest_date.day, newest_date.year
)
# <=>
newest_filename = "{:%m-%d-%Y}.csv".format(newest_date)
`csv_data` ist mehr als nur die Daten, da ist eine komplette Serverantwort mit Headern enthalten. Und CSV-Daten nur wenn die Abfrage erfolgreich war.
Überarbeitet:
Code: Alles auswählen
#!/usr/bin/env python3
from datetime import datetime as DateTime
from pathlib import Path
import requests
GITHUB_API_URL = (
"https://api.github.com/repos/CSSEGISandData/COVID-19/contents/"
"csse_covid_19_data/csse_covid_19_daily_reports"
)
def main():
response = requests.get(GITHUB_API_URL)
response.raise_for_status()
extension = ".csv"
newest_file = max(
(file for file in response.json() if file["name"].endswith(extension)),
key=lambda file: DateTime.strptime(
file["name"][: -len(extension)], "%m-%d-%Y"
),
)
response = requests.get(newest_file["download_url"])
response.raise_for_status()
Path("downloaded_data.csv").write_text(response.text, encoding="utf-8")
if __name__ == "__main__":
main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
- __blackjack__
- User
- Beiträge: 13117
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Pythonboy: Methoden sollte man auf den Objekten aufrufen und nicht auf der Klasse und das Objekt übergeben.
Wobei `strftime()` aber auch gar nicht notwendig ist, weil man das im Platzhalter bei der Formatierung erledigen kann. Da würde ich bei den Variablen dann auch `datetime.date`-Objekt behalten und bei den Ausgaben für den Benutzer nicht dieses unsägliche amerikanische Datumsformat verwenden.
`found_csv` macht das Programm unnötig umständlicher, das würde ich weg lassen.
In den beiden Fällen gibt es sehr ähnlichen Code den man in einer Funktion heraus ziehen sollte um Code-/Datenwiederholungen zu vermeiden.
Das aktuelle Datum sollte man nur einmal ermitteln, sonst kann es komisch werden wenn das Datum das erste mal *vor* Mitternacht und das zweite mal *nach* Mitternacht ermittelt wird, weil dann effektiv zweimal das selbe Datum versucht wird.
Das in den ausgegebenen Texten mit „gesucht“ und „gefunden“ ist ein bisschen irreführend, denn da wird nichts gesucht, sondern es wird versucht herunterzuladen. Und „nicht gefunden“ ist ja bei weitem nicht der einzige Grund warum das herunterladen nicht funktioniert haben könnte und auch Protokollfehler sind nicht die einzigen Gründe. Die Fehlerbehandlung ist so nicht wirklich sinnvoll und unvollständig.
Zwischenstand:
Wobei `strftime()` aber auch gar nicht notwendig ist, weil man das im Platzhalter bei der Formatierung erledigen kann. Da würde ich bei den Variablen dann auch `datetime.date`-Objekt behalten und bei den Ausgaben für den Benutzer nicht dieses unsägliche amerikanische Datumsformat verwenden.
`found_csv` macht das Programm unnötig umständlicher, das würde ich weg lassen.
In den beiden Fällen gibt es sehr ähnlichen Code den man in einer Funktion heraus ziehen sollte um Code-/Datenwiederholungen zu vermeiden.
Das aktuelle Datum sollte man nur einmal ermitteln, sonst kann es komisch werden wenn das Datum das erste mal *vor* Mitternacht und das zweite mal *nach* Mitternacht ermittelt wird, weil dann effektiv zweimal das selbe Datum versucht wird.
Das in den ausgegebenen Texten mit „gesucht“ und „gefunden“ ist ein bisschen irreführend, denn da wird nichts gesucht, sondern es wird versucht herunterzuladen. Und „nicht gefunden“ ist ja bei weitem nicht der einzige Grund warum das herunterladen nicht funktioniert haben könnte und auch Protokollfehler sind nicht die einzigen Gründe. Die Fehlerbehandlung ist so nicht wirklich sinnvoll und unvollständig.
Zwischenstand:
Code: Alles auswählen
import urllib.request
from datetime import date as Date, timedelta as TimeDelta
BASE_URL = (
"https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/"
"csse_covid_19_data/csse_covid_19_daily_reports/"
)
FILENAME = "Corona.csv"
def retrieve_csv_file(date):
urllib.request.urlretrieve(f"{BASE_URL}{date:%m-%d-%Y}.csv", FILENAME)
def get_latest_csv():
#
# FIXME Exception handling isn't complete and output not very helpful to
# find the source of the problem.
#
today = Date.today()
try:
retrieve_csv_file(today)
except urllib.error.HTTPError:
print(
f"Die Datei vom {today} konnte nicht heruntergeladen werden.\n"
f"Es wird die Datei vom Vortag heruntergeladen."
)
yesterday = today - TimeDelta(1)
try:
retrieve_csv_file(yesterday)
except urllib.error.HTTPError:
print("Datei konnte nicht heruntergeladen werden.")
else:
print(f"Datei vom {yesterday} heruntergeladen!")
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman