Проблема при преобразовании даты в формат даты и времени в панде. - PullRequest
0 голосов
/ 15 мая 2018

Вот кадр данных.Я хочу, чтобы даты были в формате '%Y-%m-%d %H:%M:%S'.

import pandas as pd
df2 = pd.DataFrame([['2017-18','','','','','','','','','','','',''], ['COMPANIES', '01-APR-2017', '01-MAY-2017', '01-JUN-2017', 
                    '01-JULY-2017', '01-AUG-2017', '01-SEP-2017', '01-OCT-2017', '01-NOV-2017', '01-DEC-2017', '01-JAN-2018', '01-FEB-2018', '01-MAR-2018']])

Я пытался,

df2.iloc[1, 1:] = df2.iloc[1, 1:].str.replace("JULY", "JUL")
df2.iloc[1, 1:] = df2.iloc[1, 1:].apply(pd.to_datetime, format = '%d-%b-%Y')

, но это дает:

          0                    1                    2                    3   \
0    2017-18                                                                  
1  COMPANIES  1491004800000000000  1493596800000000000  1496275200000000000   

                    4                    5                    6   \
0                                                                  
1  1498867200000000000  1501545600000000000  1504224000000000000   

                    7                    8                    9   \
0                                                                  
1  1506816000000000000  1509494400000000000  1512086400000000000   

                    10                   11                   12  
0                                                                 
1  1514764800000000000  1517443200000000000  1519862400000000000  

Я что-то упустил?Есть ли другой способ получить даты в требуемом формате?

Я даже пытался:

for i in df2.iloc[1, 1:]:
    i = datetime.datetime.fromtimestamp(int(i)).strftime('%Y-%m-%d %H:%M:%S')

, но дает ValueError: timestamp out of range for platform localtime()/gmtime() function

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Ваша временная метка сохраняется в двух разных строках.Первая строка содержит одну временную метку и несколько пустых записей.Вторая строка содержит строку 'COMPANIES' И datetime в виде строк.Теперь, когда вы попытаетесь проанализировать эти строки даты и времени в формате даты и времени, они будут проанализированы и затем преобразованы в абсолютный числовой формат даты, например 1506816000000000000.

Это потому, что pandas сохраняет вторую строку как dtype=object, поскольку он имеет смешанные типы: строки и даты и времени.
Чтобы правильно представлять дату и время, они должны храниться в строке / столбцах с правильным значением dtype.Чтобы показать вам эффект от их отдельного хранения:

dates = pd.to_datetime(df2.iloc[1, 1:], format = '%d-%b-%Y')

Кстати: почему все используют apply()?Просто вызов функции непосредственно для строки / столбца намного быстрее и интуитивнее.

0 голосов
/ 15 мая 2018

По моему мнению, вы должны транспонировать свой фрейм данных и использовать dateutil.parser, который является более гибким по отношению к формату ввода даты.

Структурно, pandas работает лучше и наиболее интуитивно, когда у вас есть серии (или столбцы) фиксированных типов.

Настройка

import pandas as pd
from dateutil import parser

df2 = pd.DataFrame([['2017-18','','','','','','','','','','','',''], ['COMPANIES', '01-APR-2017', '01-MAY-2017', '01-JUN-2017', 
                    '01-JULY-2017', '01-AUG-2017', '01-SEP-2017', '01-OCT-2017', '01-NOV-2017', '01-DEC-2017', '01-JAN-2018', '01-FEB-2018', '01-MAR-2018']])

Решение

res = df2.T.iloc[1:, 1].apply(parser.parse)

Результат

print(res)

1    2017-04-01
2    2017-05-01
3    2017-06-01
4    2017-07-01
5    2017-08-01
6    2017-09-01
7    2017-10-01
8    2017-11-01
9    2017-12-01
10   2018-01-01
11   2018-02-01
12   2018-03-01
Name: 1, dtype: datetime64[ns]
0 голосов
/ 15 мая 2018

Вы можете получить доступ к strftime, используя .dt

Ex:

import pandas as pd
df2 = pd.DataFrame([['2017-18','','','','','','','','','','','',''], ['COMPANIES', '01-APR-2017', '01-MAY-2017', '01-JUN-2017', 
                    '01-JULY-2017', '01-AUG-2017', '01-SEP-2017', '01-OCT-2017', '01-NOV-2017', '01-DEC-2017', '01-JAN-2018', '01-FEB-2018', '01-MAR-2018']])


df2.iloc[1, 1:] = df2.iloc[1, 1:].str.replace("JULY", "JUL")
df2.iloc[1, 1:] = df2.iloc[1, 1:].apply(pd.to_datetime, format = '%d-%b-%Y').dt.strftime('%Y-%m-%d %H:%M:%S')

print(df2)

Выход:

          0                    1                    2                    3   \
0    2017-18                                                                  
1  COMPANIES  2017-04-01 00:00:00  2017-05-01 00:00:00  2017-06-01 00:00:00   

                    4                    5                    6   \
0                                                                  
1  2017-07-01 00:00:00  2017-08-01 00:00:00  2017-09-01 00:00:00   

                    7                    8                    9   \
0                                                                  
1  2017-10-01 00:00:00  2017-11-01 00:00:00  2017-12-01 00:00:00   

                    10                   11                   12  
0                                                                 
1  2018-01-01 00:00:00  2018-02-01 00:00:00  2018-03-01 00:00:00  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...