Панды читают и анализируют данные Excel, которые отображаются как дата и время, но не должны быть временем - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть система, которую я читаю, которая довольно плохо реализовала функцию отслеживания времени - она ​​показывает отслеженное рабочее время в ячейке как [чч]: мм.Теперь это проблематично при попытке прочитать эти данные, потому что когда вы щелкаете по этой ячейке, строка данных показывает 23:00:00 PM, но то, что на самом деле представляет 23:00, это 23 часа потраченного времени, а не 11PM.Поэтому, когда время 24:00 или более, вы заканчиваете 01.01.1900 в 12:00:00 и начинаете (25:00 = 01.01.1900 в 01:00:00).

Таким образом, панды выбирают 11:00:00 или 01.01.1900 01:00:00, когда они попадают в информационный кадр.Я в недоумении относительно того, как бы я положил это обратно в INT и получить количество часов в формате целых чисел 24, 25, 32 и т. Д.

Может кто-нибудь помочь мне разобраться, какпревратить эти ужасно отформатированные данные в количество часов в формате int?

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Если вы хотите, чтобы 1/1/1900 01:00:00 AM представляло 25 часов прошедшего времени, то это говорит о том, что ваша контрольная отметка времени составляет 12/31/1899 00:00:00.Попробуйте следующее:

time_delta = pd.Timestamp('1/1/1900 01:00:00 AM') - pd.Timestamp('12/31/1899 00:00:00')
# returns Timedelta('1 days 01:00:00')

Вы можете получить общее количество секунд, используя метод Timedelta.total_seconds():

time_delta.total_seconds()
# returns 90000.0

, а затем вы можете получить количество часов с помощью

time_delta.total_seconds() / 3600.0
# returns 25.0

Поэтому попробуйте вычесть pd.Timestamp('12/31/1899 00:00:00') из вашего DatetimeIndex на основе 1900 года, чтобы получить TimedeltaIndex.Затем вы можете оставить TimedeltaIndex как есть или преобразовать его в Float64Index с помощью TimedeltaIndex.total_seconds().

0 голосов
/ 30 ноября 2018

Вот где я закончил, и это работает:

for i in range(len(df['Planned working time'])) :
    pwt = df['Planned working time'][i]
    if len(str(df['Planned working time'][i]).split(' ')) > 1 :
        if str(str(pwt).split(' ')[0]).split('-')[0] == '1900' :
            workint = int(24)*int(str(str(pwt).split(' ')[0]).split('-')[2]) + int(str(pwt).split(' ')[1].split(':')[0])

    elif len(str(pwt).split(' ')) == 1 :
        if str(str(pwt).split(' ')[0]).split('-')[0] != '1900' :
            workint = int(str(pwt).split(' ')[0].split(':')[0])

    df.set_value(i, 'Planned working time', workint)

приветствуются любые предлагаемые улучшения, но это приводит к правильным значениям int во всех случаях.Протестировано на более чем 14 000 строк данных.Это, вероятно, пришлось бы уточнить, если бы были минуты, но нет случаев, когда в данных отображаются минуты, а пользовательский интерфейс на внешнем интерфейсе фактически не позволяет минут.

0 голосов
/ 29 ноября 2018

pandas не виноват, это Excel, который неправильно интерпретирует данные. Установите для данных текст в этом столбце, и он не будет интерпретироваться как дата.затем сохраните файл и откройте через панд, и он должен работать нормально.Другой мудрый экспорт как CSV и попытаться открыть в пандах.

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