Как применить сортировку по возрастанию для даты и времени в каждой группе панд - PullRequest
0 голосов
/ 27 июня 2019

У меня есть набор данных для группировки в соответствии с 'user_id' и 'contest_id', и среди них я должен отсортировать каждого пользователя в каждом конкурсе, который участвовал в конкурсе, на основе даты и времени в порядке возрастания.

Я попытался сначала сгруппировать данные в соответствии с contest_id и user handle, затем я попытался отсортировать даты в порядке возрастания с помощью sort_values ​​после преобразования столбца datetime в `to_datetime '

Когда я пытаюсь сохранить код, выдает ошибку '' '

      Excel doesn't support timezones in datetimes. Set the tzinfo in the 

       datetime/time object to None or use the 'remove_timezone' Workbook() 

       option

'' '


       dftotal.groupby(["contestID", "userHandle"])

       dftotal["registerDateTime"]=pd.to_datetime(dftotal.registerDateTime)

       dftotal["RegistrationDateTime"] = dftotal["registerDateTime"]

       dftotal["submitDateTime"] = pd.to_datetime(dftotal.submitDateTime)

       dftotal["SubmissionDateTime"] = dftotal["submitDateTime"]

       dftotal = dftotal.sort_values(by=['RegistrationDateTime'])

данные

        contest_id user_id  registration    submission          score 
        1234       abc     2012-01-09       2012-01-09           90
                          21:51:00+00:00   22:51:00+00:00 


        4489      pabc     2013-01-09     2013-01-09             39
                         21:51:00+00:00   22:55:00+00:00 

        1234     tiop      2012-01-09      2012-01-09            100
                        23:51:00+00:00   23:55:00+00:00 

        4489    pabceu    2013-01-09      2013-01-09              39
                        23:20:00+00:00   23:55:00+00:00  

ожидается

        contest_id user_id   registration     submission             score 
        1234       abc      2012-01-09       2012-01-09              90
                         21:51:00+00:00   22:51:00+00:00 

        1234      tiop    2012-01-09       2012-01-09               100
                        23:51:00+00:00    23:55:00+00:00 

        4489      pabc    2013-01-09      2013-01-09                 39
                        21:51:00+00:00   22:55:00+00:00 

        4489     pabceu   2013-01-09     2013-01-09                  39
                        23:20:00+00:00  23:55:00+00:00

1 Ответ

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

Я наконец смог воспроизвести и исправить.

Шаги для воспроизведения

import pandas as pd
import io

t = '''contest_id  user_id  registration    submission          score 
        1234       abc     2012-01-09 21:51:00+00:00       2012-01-09 22:51:00+00:00           90
        4489      pabc     2013-01-09 21:51:00+00:00     2013-01-09 22:55:00+00:00             39
        1234     tiop      2012-01-09 23:51:00+00:00      2012-01-09 23:55:00+00:00            100
        4489    pabceu    2013-01-09 23:20:00+00:00      2013-01-09 23:55:00+00:00              39'''

dftotal=pd.read_csv(io.StringIO(t), sep=r'\s\s+', engine='python')

print(dftotal.to_string())

dftotal['registration'] = pd.to_datetime(dftotal.registration, utc=True)
dftotal['submission'] = pd.to_datetime(dftotal.submission, utc=True)

print(dftotal.to_string())
dftotal.to_excel('contest_new.xlsx')

Который отображает:

   contest_id user_id               registration                 submission  score
0        1234     abc  2012-01-09 21:51:00+00:00  2012-01-09 22:51:00+00:00     90
1        4489    pabc  2013-01-09 21:51:00+00:00  2013-01-09 22:55:00+00:00     39
2        1234    tiop  2012-01-09 23:51:00+00:00  2012-01-09 23:55:00+00:00    100
3        4489  pabceu  2013-01-09 23:20:00+00:00  2013-01-09 23:55:00+00:00     39
   contest_id user_id              registration                submission  score
0        1234     abc 2012-01-09 21:51:00+00:00 2012-01-09 22:51:00+00:00     90
2        1234    tiop 2012-01-09 23:51:00+00:00 2012-01-09 23:55:00+00:00    100
1        4489    pabc 2013-01-09 21:51:00+00:00 2013-01-09 22:55:00+00:00     39
3        4489  pabceu 2013-01-09 23:20:00+00:00 2013-01-09 23:55:00+00:00     39

и повышает:

TypeError: Excel не поддерживает часовые пояса в datetime. Установите для tzinfo в объекте datetime / time значение None или используйте параметр workbook () remove_timezone *

Возможные исправления:

  1. Использовать openpyxl:

    Эта ошибка возникает в бэкэнде xlsxwriter. Если openpyxl установлен, достаточно запросить этот движок:

    ...
    dftotal.to_excel('contest_new.xlsx', engine='openpyxl')
    

    Он автоматически удаляет информацию tz и корректно записывает в файл excel

  2. Явно удалите информацию ts:

    информация о часовом поясе может быть явно удалена с помощью tz_localize(None):

    ...
    dftotal['registration'] = pd.to_datetime(dftotal.registration).dt.tz_localize(None)
    dftotal['submission'] = pd.to_datetime(dftotal.submission).dt.tz_localize(None)
    dftotal = dftotal.sort_values(by=['registration'])
    print(dftotal.to_string())
    
    dftotal.to_excel('contest_new.xlsx')
    

    Фрейм данных отображается как:

       contest_id user_id        registration          submission  score
    0        1234     abc 2012-01-09 21:51:00 2012-01-09 22:51:00     90
    2        1234    tiop 2012-01-09 23:51:00 2012-01-09 23:55:00    100
    1        4489    pabc 2013-01-09 21:51:00 2013-01-09 22:55:00     39
    3        4489  pabceu 2013-01-09 23:20:00 2013-01-09 23:55:00     39
    

    и записывается без ошибок по умолчанию движком xlsxwriter.

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