如何使用Pandas更快地处理13665600行CSV文件(我已经上传到数据库中)?

2024-04-25 02:11:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个全年在390个不同地点每隔15分钟采集的天气数据的csv文件。我将其上传到本地SQLite数据库,以使处理更容易

现在,我试图计算全年193个地点的日平均温度,并将其作为json文件输出,但我在编写一个能够在合理时间内做到这一点的函数时遇到了很多麻烦

这就是我到目前为止所做的:

def getMeanWeather(coords):
    data = {coord: {} for coord in coords}
    def analyze(start, end):
        for month in range(start, end):
            for day in range(1, 32):
                currDay = f"2015-{str(month).zfill(2)}-{str(day).zfill(2)}"
                df = fetch.getWeather(usecols='temp,lat,lon', datetime=currDay, coordinates=coords)
                if not df.empty:
                    for coord in coords:
                        data[coord][curr_day] = df[(df['lat'] == coord[0]) & (df['lon'] == coord[1])]['temp'].mean()

    t1 = threading.Thread(target=analyze(1, 3), name="t1")
    t2 = threading.Thread(target=analyze(3, 5), name="t2")
    t3 = threading.Thread(target=analyze(5, 7), name="t3")
    t4 = threading.Thread(target=analyze(7, 9), name="t4")
    t5 = threading.Thread(target=analyze(9, 11), name="t5")
    t6 = threading.Thread(target=analyze(11, 13), name="t6")

    threads = [t1, t2, t3, t4, t5, t6]
    for t in threads:
        t.start()
    for t in threads:
        t.join()

    return data

总之,我的代码为所有193个位置创建了一个每日天气数据框,然后遍历这些位置,并使用正确的坐标获取行的子数据框的平均值data是我打算转储到json文件中的字典

coords是193个坐标的元组列表

fetch是我编写的一个模块,它允许我抽象出编写SQL查询的需要,并根据需要从数据库中获取数据。我天真地开始使用线程库,试图加快速度,但这也没有多大帮助

我已经为一个坐标和所有390个位置的统计数据运行了类似的代码,而不是单独运行。在这些情况下,代码运行大约需要10分钟。在我看来还不错,但一旦我把规模扩大到193个地点,肯定不可行

我的桌子看起来像这样:

|----------------|----------------|----------------|----------------|
|   date         |     temp       |      lat       |     lon        |
|----------------|----------------|----------------|----------------|
|2015-01-01 0:00 |      67        |      30        |     -90        |
|----------------|----------------|----------------|----------------|

继续进行每次390个不同纬度和经度的测量,然后每15分钟用相同的390个坐标进行新的测量

我希望输出的格式如下:

data = {(lat_1, lon_1):{"2015-01-01": 26.03372999919653,
                        "2015-01-02": 31.196771341785723,
                               ⋮
                        "2015-12-31": 40.02},
               ⋮
         (lat_193, lon_193):{...}
        }

我不知道我能做些什么来让这段代码更智能、更快,如果有任何建议,我将不胜感激。我也很想知道为什么我现在做的不管用,这样我就可以从中学习