Объединить частично перекрывающиеся файлы JSON, перезаписывая старые данные самыми последними данными - PullRequest
1 голос
/ 23 марта 2020

У меня есть серия JSON файлов. Все последующие файлы содержат частично перекрывающиеся данные с предыдущим. Как показано в примере ниже, последние 3 строки первого файла имеют те же временные метки, что и первые 3 строки второй таблицы.

Первый файл:

                wind_v    wind_u    dewpoint     temp       rh
hours
1555038000000 -1.412255 -0.023800  283.15000  284.15000  24.53871
1555048800000 -0.164115 -1.692985  284.32549  286.47823  21.82451
1555059600000  0.055155 -2.692985  285.04983  288.09226  21.82451
1555070400000 -2.412255 -0.857100  284.26031  286.47823  33.66288
1555081200000 -1.192985 -0.055155  284.15000  285.15000  30.98614
1555092000000 -0.857100  0.114030  283.71146  284.32549  37.11403

Второй файл:

               wind_v   wind_u   dewpoint    temp       rh
hours
1555070400000 -0.0572  3.4300  210.152144  292.03969  79.8188
1555081200000  0.4200  4.7622  207.006067  291.71146  83.1700
1555092000000  1.1578 -1.2322  205.239848  294.32549  73.7388
1555102800000  0.1750  0.9200  205.420127  297.86420  83.2532
1555113600000  0.2778  2.6106  206.944729  297.03969  82.2800
1555124400000 -2.4828  3.3722  208.115948  296.15000  83.7500

Я хотел бы объединить все файлы в один файл и перезаписать значения самыми последними значениями.

import pandas as pd
import json
import os

directory = './'

fileNames = [x for x in os.listdir(directory) if x.endswith(".json")]
fileNames = sorted(fileNames)

# Open first 2 files
with open(directory + fileNames[0]) as file1, open(directory + fileNames[1]) as file2:
    data2 = json.load(file2)
    df2 = pd.DataFrame(data2['data'])
    df2.set_index('hours', inplace=True, drop=True)

    data1 = json.load(file1)
    df1 = pd.DataFrame(data1['data'])
    df1.set_index('hours', inplace=True, drop=True)

print(df1)
print(df1)

# This does not work either
result = pd.merge(df1, df2, how='outer', on='hours')

print(result)

Что делает мой код:

               wind_v_x  wind_u_x  dewpoint_x     temp_x      rh_x  wind_v_y  wind_u_y  dewpoint_y     temp_y     rh_y
hours
1555038000000 -1.412255 -0.023800   283.15000  284.15000  24.53871       NaN       NaN         NaN        NaN      NaN
1555048800000 -0.164115 -1.692985   284.32549  286.47823  21.82451       NaN       NaN         NaN        NaN      NaN
1555059600000  0.055155 -2.692985   285.04983  288.09226  21.82451       NaN       NaN         NaN        NaN      NaN
1555070400000 -2.412255 -0.857100   284.26031  286.47823  33.66288   -0.0572    3.4300  210.152144  292.03969  79.8188
1555081200000 -1.192985 -0.055155   284.15000  285.15000  30.98614    0.4200    4.7622  207.006067  291.71146  83.1700
1555092000000 -0.857100  0.114030   283.71146  284.32549  37.11403    1.1578   -1.2322  205.239848  294.32549  73.7388
1555102800000       NaN       NaN         NaN        NaN       NaN    0.1750    0.9200  205.420127  297.86420  83.2532
1555113600000       NaN       NaN         NaN        NaN       NaN    0.2778    2.6106  206.944729  297.03969  82.2800
1555124400000       NaN       NaN         NaN        NaN       NaN   -2.4828    3.3722  208.115948  296.15000  83.7500

Как я хочу, чтобы это было:

                wind_v    wind_u   dewpoint      temp        rh
hours
1555038000000 -1.412255 -0.023800  283.15000   284.15000  24.53871
1555048800000 -0.164115 -1.692985  284.32549   286.47823  21.82451
1555059600000  0.055155 -2.692985  285.04983   288.09226  21.82451
1555070400000 -0.0572    3.4300    210.152144  292.03969  79.8188
1555081200000  0.4200    4.7622    207.006067  291.71146  83.1700
1555092000000  1.1578   -1.2322    205.239848  294.32549  73.7388
1555102800000  0.1750    0.9200    205.420127  297.86420  83.2532
1555113600000  0.2778    2.6106    206.944729  297.03969  82.2800
1555124400000 -2.4828    3.3722    208.115948  296.15000  83.7500

Любой намек поможет.

1 Ответ

1 голос
/ 23 марта 2020

Одним из решений является использование дополнительного столбца, в котором вы сохраняете приоритет файла.

Здесь приведены шаги:

  • Добавьте один столбец в соответствии с приоритетом файлов (1 - это самый низкий приоритет, n самый большой)
  • Конкатировать все данные, используя concat
  • Удалять дубликаты, оставляя только строки с самым большим приоритетом:
    • Группируйте строки по часам, используя groupby
    • Выберите наибольшее значение priority, используя transform.

код:

print(df_1)
#                  wind_v    wind_u   dewpoint       temp        rh  file
# hours                                                                  
# 1555038000000 -1.412255 -0.023800  283.15000  284.15000  24.53871     1
# 1555048800000 -0.164115 -1.692985  284.32549  286.47823  21.82451     1
# 1555059600000  0.055155 -2.692985  285.04983  288.09226  21.82451     1
# 1555070400000 -2.412255 -0.857100  284.26031  286.47823  33.66288     1
# 1555081200000 -1.192985 -0.055155  284.15000  285.15000  30.98614     1
# 1555092000000 -0.857100  0.114030  283.71146  284.32549  37.11403     1
print(df_2)
#                wind_v  wind_u    dewpoint       temp       rh  file
# hours                                                              
# 1555070400000 -0.0572  3.4300  210.152144  292.03969  79.8188     2
# 1555081200000  0.4200  4.7622  207.006067  291.71146  83.1700     2
# 1555092000000  1.1578 -1.2322  205.239848  294.32549  73.7388     2
# 1555102800000  0.1750  0.9200  205.420127  297.86420  83.2532     2
# 1555113600000  0.2778  2.6106  206.944729  297.03969  82.2800     2
# 1555124400000 -2.4828  3.3722  208.115948  296.15000  83.7500     2

df = pd.concat([df_1,df_2])
print(df)
#                 wind_v    wind_u    dewpoint       temp        rh  file
# hours                                                                   
# 1555038000000 -1.412255 -0.023800  283.150000  284.15000  24.53871     1
# 1555048800000 -0.164115 -1.692985  284.325490  286.47823  21.82451     1
# 1555059600000  0.055155 -2.692985  285.049830  288.09226  21.82451     1
# 1555070400000 -2.412255 -0.857100  284.260310  286.47823  33.66288     1
# 1555081200000 -1.192985 -0.055155  284.150000  285.15000  30.98614     1
# 1555092000000 -0.857100  0.114030  283.711460  284.32549  37.11403     1
# 1555070400000 -0.057200  3.430000  210.152144  292.03969  79.81880     2
# 1555081200000  0.420000  4.762200  207.006067  291.71146  83.17000     2
# 1555092000000  1.157800 -1.232200  205.239848  294.32549  73.73880     2
# 1555102800000  0.175000  0.920000  205.420127  297.86420  83.25320     2
# 1555113600000  0.277800  2.610600  206.944729  297.03969  82.28000     2
# 1555124400000 -2.482800  3.372200  208.115948  296.15000  83.75000     2

df = df[df['file'] == df.groupby("hours")['file'].transform('max')]
#                 wind_v    wind_u    dewpoint       temp        rh  file
# hours                                                                   
# 1555038000000 -1.412255 -0.023800  283.150000  284.15000  24.53871     1
# 1555048800000 -0.164115 -1.692985  284.325490  286.47823  21.82451     1
# 1555059600000  0.055155 -2.692985  285.049830  288.09226  21.82451     1
# 1555070400000 -2.412255 -0.857100  284.260310  286.47823  33.66288     1
# 1555081200000 -1.192985 -0.055155  284.150000  285.15000  30.98614     1
# 1555092000000 -0.857100  0.114030  283.711460  284.32549  37.11403     1
# 1555070400000 -0.057200  3.430000  210.152144  292.03969  79.81880     2
# 1555081200000  0.420000  4.762200  207.006067  291.71146  83.17000     2
# 1555092000000  1.157800 -1.232200  205.239848  294.32549  73.73880     2
# 1555102800000  0.175000  0.920000  205.420127  297.86420  83.25320     2
# 1555113600000  0.277800  2.610600  206.944729  297.03969  82.28000     2
# 1555124400000 -2.482800  3.372200  208.115948  296.15000  83.75000     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...