【问题标题】:How to use a column filled with floats in the function Point(lat=float,lon=float) of meteostat? Python如何在meteostat的函数Point(lat=float,lon=float)中使用填充有浮点数的列? Python
【发布时间】:2021-12-10 05:57:24
【问题描述】:

我正在尝试使用 Daily(Point(lat,lon), start-date, end-date) 构建数据框, 的函数meteostat 库,使用纬度和经度返回由 Point(lat,lon) 指示的位置从开始日期到结束日期的所有每日天气统计数据。

问题是 (lat, lon) 参数必须是 float ,因此只能指示一个位置。我想添加几个地点并收集每个地点的每日气象数据。

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:\Users\leoac\OneDrive\Desktop\Coding\Python apps\Correlation temp-goals in Serie A\seasons 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)

【问题讨论】:

    标签: python weather


    【解决方案1】:

    这是一个受this github issue 启发的解决方案。它对不同位置发出并行请求,然后将结果合并到 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
    

    【讨论】:

    • Executor(tasks) 命令返回此错误:“RuntimeError:在当前进程完成其引导阶段之前已尝试启动新进程。这可能意味着您没有使用 fork启动您的子进程并且您忘记在主模块中使用正确的习惯用法: if name == 'main': freeze_support() ... "freeze_support ()" 如果程序不会被冻结以生成可执行文件,则可以省略行。"
    • 我更新了代码,@LeonardoAcquaroli 还有问题吗?
    • 你也可以去掉多处理,按顺序进行。
    • 是的!多处理工作正常。现在的问题是 datetime() 函数无法将我的字符串列表(格式正确为 Y、m、d)识别为用逗号分隔的整数。有什么提示吗?
    • 你是我的心上人!很抱歉,我仍然无法投票,因为我有 13 岁的声望,但你真的拯救了我的工作,给了我很多东西! GG
    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多