Форматирование даты в chr при объединении файлов CSV в pandas - PullRequest
1 голос
/ 25 марта 2020

У меня проблема с приведенной ниже функцией mergeit2.

Функция объединяет два файла вместе.

Файл текущего года и файл c истории. В файле historyi c даты представлены в формате chr (10), а в текущем файле даты представлены в формате даты. Затем, когда я загружаю данные в Tableau, я хочу перевести все даты в формат chr (10), распознав столбец как столбец str. Тем не менее, это почему-то не работает. Должен ли я заменить свое распознавание str другой командой?

Мой код, как показано ниже:

import pandas as pd
import os
import glob
import time
import numpy as np

def mergeit2(path1, path2):
             for fl in path1:
                    df = pd.read_csv(fl, header = None, skiprows = 0)
                    df = df.replace(to_replace = 'Date', value = np.nan).dropna()
                    dflist.append(df)
             concat2 = pd.concat(dflist, axis = 0)
             concat2.to_csv(path2,header = cols, index = False)
             df = pd.read_csv(path2)
             df['Date'] = df['Date'].astype(str)
             df.to_csv(path2, index = False)

cols = ['Year','Month','Week','Week in Number','Date','GPU Util%','CPU Util%']
dflist = []
path1 = glob.iglob('C:\*Users\<username>..<rest of path>..\*Data_*.csv')
path2 = "C:\\Users\\<username>..<rest of path>..\\Data_master.csv"
mergeit2(path1,path2)

Пример набора данных:

Перед выполнением кода:

Current file Example Data
Int   int     Str     int            datetime64   float        float
Year    Month   Week    Week in Number  Date    GPU Util%   CPU Util%
2020    1   First   1        01/01/2020   0.680           0.450
2020    1   First   1        02/01/2020   0.320           0.056
2020    1   First   1        03/01/2020   0.560           0.470
2020    1   First   1        04/01/2020   0.520           0.325
Historic File Example Data
int   int     Str     int            chr(10)       float          float
Year    Month   Week    Week in Number  Date    GPU Util%   CPU Util%
2019    1   First   1        05/01/2020   0.467           0.284
2019    1   Second  2        06/01/2020   0.516           0.360
2019    1   Second  2        07/01/2020   0.501           0.323
2019    1   Second  2        08/01/2020   0.494           0.322

После выполнения кода ( объединенный главный файл CSV - некоторые даты в chr (10) и другие в формате datetime)

Year    Month   Week    Week in Number  Date    GPU Util%   CPU Util%
2020    1   First   1        2020-01-01   0.680           0.450
2020    1   First   1        2020-01-02   0.320           0.056
2020    1   First   1        2020-01-03   0.560           0.470
2020    1   First   1        2020-01-04   0.520           0.325
int   int     Str     int            chr(10)       float          float
2019    1   First   1        05/01/2020   0.467           0.284
2019    1   Second  2        06/01/2020   0.516           0.360
2019    1   Second  2        07/01/2020   0.501           0.323
2019    1   Second  2        08/01/2020   0.494           0.322

Мой ожидаемый результат следующий:

Int   int     Str     int            chr(10)     float           float
Year    Month   Week    Week in Number  Date    GPU Util%   CPU Util
2020    1   First   1        01/01/2020   0.680           0.450
2020    1   First   1        02/01/2020   0.320           0.056
2020    1   First   1        03/01/2020   0.560           0.470
2020    1   First   1        04/01/2020   0.520           0.325
2019    1   First   1        05/01/2020   0.467           0.284
2019    1   Second  2        06/01/2020   0.516           0.360
2019    1   Second  2        07/01/2020   0.501           0.323
2019    1   Second  2        08/01/2020   0.494           0.322

1 Ответ

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

Прежде всего, большое спасибо Сержу Баллесте. Вы не можете себе представить, сколько человеко-часов работы вы спасли меня, и спасибо за ваши добрые объяснения по поводу нашего обсуждения.

Серж упомянул:

Подсказка: вы можете попросить pandas разобрать даты в текущем файле и используйте dt.strftime для принудительного использования ожидаемого формата

Я изменил свою функцию mergeit2 следующим образом:

Я импортировал библиотеку даты и времени и изменил несколько строк ниже (см. строки с комментариями)

import datetime

 def mergeit2(path1, path2):
         for fl in path1:
                df = pd.read_csv(fl, sep = ",", parse_dates = True) #Changed this line to include separator and parse_dates function.
                df['Date'] = df['Date'].dt.strftime('%d/%m/%Y') #added this line to ensure Dates are recognised as strings and transformed to the shape I want
                dflist.append(df)
         concat2 = pd.concat(dflist, axis = 0)
         concat2.to_csv(path2,header = cols, index = False)
         df = pd.read_csv(path2)
         df['Date'] = df['Date'].astype(str)
         df.to_csv(path2, index = False)
...