Как указать dtype для pd.read_csv, когда нет заголовков столбцов? - PullRequest
0 голосов
/ 29 мая 2020

В настоящее время я пишу код для анализа большого набора данных. Я использовал pandas для чтения текстовых файлов и распечатываю его с помощью data.head (). Мне нужно указать dtype для 9 столбцов (девятый - null), потому что в противном случае процесс был бы слишком интенсивным, но я понятия не имею, как указать dtype для столбцов, у которых отсутствуют заголовки столбцов. Будет ли это то же самое, что и указать dtype для заголовков столбцов? Для справки тип данных моих столбцов, вероятно, будет следующим:

Столбец 1: смешанный, поскольку он содержит буквенно-цифровые символы c символы

Столбец 2: Дата в формате YY / MM / DD

Столбец 3: Время в часах / минутах / секундах / миллисекундах

Столбец 4: Str

Столбец 5: Время

Столбец 6: Str

Столбец 7: Время

Столбец 8: Время

Столбец 9: Нулевой

Вот отрывок из текстового файла

Вот также отрывок из моего кода

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

    path = '/Users/MysteriousHo-Oh1231/Downloads/Datapoints1/*.txt'
    dataframes = []
    for filename in glob.iglob(path):
      data = pd.read_csv(filename, header=None, delimiter='\t',  dtype={0: object, 1: int, 2: int, 3: object, 4: int, 5: object, 6: int, 7: int, 8: None})
      print(data.head())

Я попробовал приведенный выше код, и он вернул эту ошибку :

Пожалуйста, помогите мне с этим!

1 Ответ

0 голосов
/ 29 мая 2020

Определите 3 следующие функции преобразования:

def strToDate(tt):
    return pd.to_datetime(tt, yearfirst=True)

def strToTime(tt):
    return pd.to_datetime(tt, format='%I:%M:%S.%f').time()

def strToTime2(tt):
    return pd.Timestamp(float(tt), unit='s').time()

Затем прочтите свой DataFrame, передав их как преобразователи для столбцов, требующих «специализированного» преобразования:

df = pd.read_csv('Input.csv', header=None, converters={ 1: strToDate,
    2: strToTime, 4: strToTime2, 6: strToTime2, 7: strToTime2 })

Когда вы печатаете df.info(), затем:

  • столбец 1 (дата) имеет тип datetime64 [нс] тип,
  • столбец 8 ( NaN s) имеет тип float64 ,
  • все остальные столбцы имеют тип объект .

Но не обманывайтесь. В Pandas тип объекта на самом деле означает «что-то отличное от числа или даты и времени».

Когда вы извлекаете отдельные значения, например, df.iloc[0,2], вы получите: datetime.time(11, 24, 31, 758000), аналогично любой ячейке из столбца 4 , 6 или 7 , поэтому они имеют только требуемый тип .

Другое решение, основанное на Timedelta

Определите функции конвертера как:

def strToDate(tt):
    return pd.to_datetime(tt, yearfirst=True)

def strToTimeDelta(tt):
    return pd.Timedelta(float(tt), unit='S')

Прочтите фрейм данных:

df = pd.read_csv('Input.csv', header=None, converters={ 1: strToDate,
    2: pd.Timedelta, 4: strToTimeDelta, 6: strToTimeDelta, 7: strToTimeDelta })

(для преобразования столбца 2 используйте родную pandasoni c функцию pd.Timedelta ).

Затем, если вам нужно преобразовать некоторые Timedelta столбец (например, столбец 7 ) до общего количества секунд, включая дробную часть, выполнить:

df[7].dt.seconds + df[7].dt.microseconds / 1e6

Но результат чтения столбцов по умолчанию 4 , 6 и 7 - это просто float , т.е. количество секунд.

Это концептуально раз, но на самом деле:

* 10 86 * во входном файле они сохраняются как text , после read_csv они float с сохранением количества секунд.

Так зачем вам преобразование этих столбцов?

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