Создание одного файла из нескольких файлов (Python 3.x) - PullRequest
0 голосов
/ 22 апреля 2020

Я не могу найти отличный способ сделать это, но у меня есть 2 файла со стандартным форматом даты и значения.

File 1             File 2
Date Value         Date Value
4     7.0          1     9.0
5     5.5          .     .
6     4.0          7     2.0

Я хочу объединить файлы 1 и 2, чтобы получить следующее :

Combined Files
Date Value1 Value2 Avg
1     NaN    9.0   9.0
2     NaN    9.0   9.0
3     NaN    8.5   8.5
4     7.0    7.5   7.25
5     5.5    5.0   5.25
6     4.0    3.5   3.75
7     NaN    2.0   2.0

Как мне это сделать? Я подумал, что должен создать замаскированный массив с датой от 1 до 7, а затем просто добавить файлы вместе, но я не знаю, как бы я это сделал с файлом 1. Любая помощь, где искать, будет оценена.

Использование Python 3.x

РЕДАКТИРОВАТЬ: Я решил свою собственную проблему! Я уверен, что есть лучший способ упростить это. Мое решение не использует приведенный выше пример, я просто добавил свой код.

def extractFiles(Dir, newDir, newDir2):
    fnames = glob(Dir)
    farray = np.array(fnames)

    ## Dates range from 723911 to 737030
    dateArray = np.arange(723911,737030) # Store the dates
    dataArray = []                       # Store the data, This needs to be a list! Not np.array!

    for f in farray:
        ## Extracting Data
        CH4 = np.genfromtxt(f, comments='#', delimiter=None, dtype=np.float).T

        myData = np.full(dateArray.shape, np.nan) # Create an masked array
        myDate = np.array([])

        ## Converts the given datetime into something more useable
        for x, y in zip(*CH4[1:2], *CH4[2:3]):
            myDate = np.append(myDate,
                              (mdates.date2num(datetime.strptime('{}-{}'.format(int(x), int(y)), '%Y-%m'))))

        ## Finds where the dates are the same and places the approprite concentration value
        for i in range(len(CH4[3])):
            idx = np.where(dateArray == myDate[i])
            myData[idx] = CH4[3, i]

        ## Store all values in the list
        dataArray.append(myData)

    ## Convert list to numpy array and save in txt file
    dataArray = np.vstack((dateArray, dataArray))
    np.savetxt(newDir, dataArray.T, fmt='%1.2f', delimiter=',')

    ## Find the averge of the data to plot
    avg = np.nanmean(dataArray[1:].T,1)
    avg = np.vstack((dateArray, avg))
    np.savetxt(newDir2, avg.T, fmt='%1.2f', delimiter=',')

    return avg

1 Ответ

0 голосов
/ 22 апреля 2020

Вот мой ответ, основанный на информации, которую вы мне дали:

import pandas as pd
import os

# I stored two Excel files in a subfolder of this sample code
# Code
# ----Files
# -------- File1.xlsx
# -------- File2.xlsx

# Here I am saving the path to a variable
file_path = os.path.join(*[os.getcwd(), 'Files', ''])

# I define an empty DataFrame that we then fill we the files information
final_df = pd.DataFrame()

# file_number will be used to increment the Value column based number of files that we load.
# First file will be Value1, second will lead to Value2
file_number = 1

# os.listdir is now "having a look" into the "Files" folder and will return a list of files which is contained in there
# ['File1.xlsx', 'File2.xlsx'] in our case
for file in os.listdir(file_path):
    # we load the Excel file with pandas function "read_excel"
    df = pd.read_excel(file_path + file)
    # Rename the column "Value" to "Value" + the "file_number"
    df = df.rename(columns={'Value': 'Value'+str(file_number)})

    # Check if the Dataframe already contains values
    if not final_df.empty:
        # If there is values already then we merge them together with the new values
        final_df = final_df.merge(df, how='outer', on='Date')
    else:
        # Otherwise we "initialize" our final_df with the first Excel file that we loaded
        final_df = df

    # at the end we increment the file number by one to continue to next file
    file_number += 1

# get all column names that have "Value" in it
value_columns = [w for w in final_df.columns if 'Value' in w]
# Create a new column for the average and build the average on all columns that we found for value columns
final_df['Avg'] = final_df.apply(lambda x: x[value_columns].mean(), axis=1)
# Sort the dataframe based on the Date
sorted_df = final_df.sort_values('Date')

print(sorted_df)

В распечатке будет напечатано:

   Date  Value1  Value2   Avg
3     1     NaN     9.0  9.00
4     2     NaN     9.0  9.00
5     3     NaN     8.5  8.50
0     4     7.0     7.5  7.25
1     5     5.5     5.0  5.25
2     6     4.0     3.5  3.75
6     7     NaN     2.0  2.00

Обратите внимание, что на это не обращают внимания имена файлов и просто загружает один файл за другим на основе алфавита.
Но это имеет то преимущество, что вы можете поместить туда столько файлов, сколько захотите.
Если вам нужно загрузить их в определенном порядке c, я, вероятно, тоже могу вам в этом помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...