Ошибка преобразования to_datetime, нераспознанный тип значения - PullRequest
0 голосов
/ 01 июня 2019

У меня есть база данных flight.csv о взлетах и ​​посадках в конкретном аэропорту и времени, связанном с каждым шагом полета, т. Е. Вылетом, колесами на земле, колесами на земле, прибытием, фактическим прибытием и вылетом и т. Д.

Теперь я хочу преобразовать время, указанное в базе данных, в виде чисел с плавающей точкой в ​​24-часовом формате. Например: 13:45 - 1345.0, 00:02 - 0002.0

Два из этих столбцов (Scheduled_departure)и запланированное прибытие) указаны в целых числах, поэтому мне очень легко преобразовать их во время следующим образом:

flights['SCHEDULED_DEPARTURE'] = flights['SCHEDULED_DEPARTURE'].apply(lambda x: '{0:0>4}'.format(x))

(для добавления нулей перед номером времени)

flights['SCHEDULED_DEPARTURE'] = pd.to_datetime(flights['SCHEDULED_DEPARTURE'],format= '%H%M').dt.time

(Для фактического преобразования`

Но так как другие столбцы находятся в числах с плавающей запятой, я не могу напрямую использовать astype (), поскольку он создает ошибку для десятичного числа.

Поэтому я попытался обойти мой путь:

pd.to_numeric(flights.DEPARTURE_TIME, downcast = 'integer')

(чтобы удалить десятичные дроби)

flights.DEPARTURE_TIME = flights.DEPARTURE_TIME.astype(dtype='int32')

(Для резервированиядля следующего шага)

flights['DEPARTURE_TIME'] = flights['DEPARTURE_TIME'].apply(lambda x: '{0:0>4}'.format(x))

(чтобы добавить нулиперед числом)

flights['DEPARTURE_TIME'] = pd.to_datetime(flights['DEPARTURE_TIME'],format= '%H%M').dt.time

(для фактического преобразования времени)

Но после этого шага выдается ошибка:

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    ~\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py in _convert_listlike_datetimes(arg, box, format, name, tz, unit, errors, infer_datetime_format, dayfirst, yearfirst, exact)
        290             try:
    --> 291                 values, tz = conversion.datetime_to_datetime64(arg)
        292                 return DatetimeIndex._simple_new(values, name=name, tz=tz)

    pandas/_libs/tslibs/conversion.pyx in 
    pandas._libs.tslibs.conversion.datetime_to_datetime64()

    TypeError: Unrecognized value type: <class 'str'>

    During handling of the above exception, another exception occurred:

    ValueError                                Traceback (most recent call last)
    <ipython-input-23-a3defb9ecd52> in <module>
    ----> 1 flights['DEPARTURE_TIME'] = 
    pd.to_datetime(flights['DEPARTURE_TIME'],format= '%H%M').dt.time

    ~\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py in 
    to_datetime(arg, errors, dayfirst, yearfirst, utc, box, format, exact, 
    unit, infer_datetime_format, origin, cache)
     590         else:
     591             from pandas import Series
 --> 592             values = convert_listlike(arg._values, True, format)
     593             result = Series(values, index=arg.index, name=arg.name)
     594     elif isinstance(arg, (ABCDataFrame, compat.MutableMapping)):

    ~\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py in 
    _convert_listlike_datetimes(arg, box, format, name, tz, unit, errors, 
    infer_datetime_format, dayfirst, yearfirst, exact)
         292                 return DatetimeIndex._simple_new(values, name=name, tz=tz)
         293             except (ValueError, TypeError):
     --> 294                 raise e
         295 
         296     if result is None:

    ~\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py in 
    _convert_listlike_datetimes(arg, box, format, name, tz, unit, errors, 
    infer_datetime_format, dayfirst, yearfirst, exact)
        259                 try:
        260                     result, timezones = array_strptime(
    --> 261                         arg, format, exact=exact, errors=errors)
        262                     if '%Z' in format or '%z' in format:
        263                         return _return_parsed_timezone_results(

     pandas/_libs/tslibs/strptime.pyx in 
     pandas._libs.tslibs.strptime.array_strptime()

     ValueError: unconverted data remains: 0

Помогите мне преобразовать эти числа с плавающей точкой во время.

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

Ожидаемая версия DEPARTURE_TIME выглядит следующим образом:

0 08:00:00 1 08:30:00 2 19:10:00 3 15:15:00 4 14:27:00 Name: SCHEDULED_DEPARTURE, dtype: object

1 Ответ

0 голосов
/ 01 июня 2019

Вместо «истинного» входного файла я использовал следующую строку:

data="""xx,DEPARTURE_TIME
f1,0800.0
f2,0830.0
f3,1910.0
f4,1515.0
f5,1427.0"""

, поэтому ввод ограничен DEPARTURE_TIME и xx , представляющими другиестолбцы.

В качестве функции преобразования я определил:

def cnv(src):
    return f'{src[0:2]}:{src[2:4]}:00'

Он будет использоваться для преобразования DEPARTURE_TIME столбца.

Источник src параметр - это строка - часть строки ввода, относящаяся к соответствующему столбцу.Возвращаемое значение: первые 2 символа, следующие 2 символа и 00 , с : между ними.

И для чтения исходного CSV я использовал:

df = pd.read_csv(pd.compat.StringIO(data),\
    converters={'DEPARTURE_TIME': cnv})

В вашей программе читайте из вашего входного файла (вместо StringIO ).

На данный момент DEPARTURE_TIME столбец имеет string type.

Но если по какой-либо причине вы хотите, чтобы этот столбец был time , вы можете выполнить другое преобразование:

df.DEPARTURE_TIME = pd.to_datetime(
    df.DEPARTURE_TIME, format= '%H:%M:%S' ).dt.time

Когда вы print (df) , как до, так и после вышеприведенной инструкции вы получите точно такой же вывод:

   xx DEPARTURE_TIME
0  f1       08:00:00
1  f2       08:30:00
2  f3       19:10:00
3  f4       15:15:00
4  f5       14:27:00

Но если вы запустите type(df.iloc[0,1]), вы увидите, что после преобразования тип равен datetime.time (до str ).

С другой стороны, если вы запустите df.info(), вы увидите, что как до, так и после последнего преобразованиятип столбца DEPARTURE_TIME равен объект .

Такой же подход вы можете использовать для других входных столбцов, отформатированных как float s.

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