#python #weather
Вопрос:
Я пытаюсь создать фрейм данных, используя Daily(Point (широта, долгота), дата начала, дата окончания), функцию библиотеки метеостата, которая возвращает всю ежедневную статистику погоды для местоположения, указанного Point (широта, долгота), используя широту и долготу, начиная с даты началадо даты окончания.
Проблема в том, что аргументы (lat, lon) должны быть с плавающей запятой и поэтому указывают только на одно местоположение. Я хочу указать несколько местоположений и собрать ежедневные метеорологические данные для каждого из них.
import meteostat
from datetime import datetime
from meteostat import Point, Daily
import matplotlib.pyplot as plt
from meteostat import Stations
import pandas as pd
import numpy
data = pd.read_csv(r'C:UsersleoacOneDriveDesktopCodingPython appsCorrelation temp-goals in Serie Aseasons 09-19.csv', ";")
date_not_converted = data['Date']
date_being_converted = datetime.strptime(date_not_converted,'%d,%m,%Y') #1bis non può essere una serie...allora provo a cambiare il tipo di dati
date = date_being_converted.strftime('%Y,%m,%d')
#plot = Daily(Point(data['lat'][15],data['lon'][15]),d1,d2).fetch()
data['temp'] = Daily(Point(data['lat'][1],data['lon'][1]),datetime(date),datetime(date)).fetch() #1 sistemare il formato data
print(data['temp']) #2 trovare un modo per inserire i vettori date e lat/lon nel df
data['temp'].plot(y=['tavg'])
plt.show()
print(data)
Ответ №1:
Вот решение, вдохновленное этой проблемой github. Он выполняет параллельные запросы для разных местоположений, а затем объединяет результаты во фрейме данных pandas.
from datetime import datetime
from meteostat import Point, Daily
from multiprocessing import cpu_count
from joblib import Parallel, delayed
import pandas as pd
def get_bulk_data(row):
location = Point(row.lat, row.lon)
data = Daily(location, row.Date, row.Date).fetch()
data["latitude"] = row.lat
data["longitude"] = row.lon
return data
if __name__ == "__main__":
df = pd.read_csv("seasons.csv", sep=";")
df["Date"] = pd.to_datetime(df["Date"], format="%d,%m,%Y")
executor = Parallel(n_jobs=cpu_count(), backend='multiprocessing')
tasks = (
delayed(get_bulk_data)(row)
for _, row in df.iterrows()
)
list_of_locations_data = executor(tasks)
data_full = pd.concat(list_of_locations_data)
print(data_full)
Он работает со следующими форматами csv и даты, вы можете адаптировать код, если ваш немного отличается:
Date;lat;lon
18,02,1997;50.3;-4.7
12,07,1998;41.3;1.5
Комментарии:
1. Команда executor(задачи) возвращает эту ошибку: «Ошибка времени выполнения: была предпринята попытка запустить новый процесс до того, как текущий процесс завершил фазу начальной загрузки. Вероятно, это означает, что вы не используете fork для запуска дочерних процессов и забыли использовать соответствующую идиому в главном модуле: if name == ‘ main ‘: freeze_support() … Строка «freeze_support()» может быть опущена, если программа не будет заморожена для создания исполняемого файла. »
2. Я обновил код, у вас все еще есть проблема @LeonardoAcquaroli?
3. Вы также можете удалить многопроцессорную обработку и выполнять ее последовательно.
4. Да! Многопроцессорная обработка работает нормально. Теперь проблема в том, что функция datetime() не распознает мой список строк (хорошо отформатированных как Y, m, d) как целые числа, разделенные запятой. Есть какие-нибудь подсказки?
5. Ты моя любимая! Извините, я все еще не могу проголосовать, потому что у меня репутация 13, но вы действительно спасли мою работу и многое мне рассказали! GG <3