Как преобразовать даты фрейма данных в числа с плавающей запятой? - PullRequest
1 голос
/ 21 июня 2020

Я пытаюсь импортировать фрейм данных из электронной таблицы, используя pandas, а затем выполнить numpy операции с его столбцами. Проблема в том, что я получаю ошибку, указанную в заголовке: TypeError: Невозможно выполнить логическую настройку на месте для смешанных типов со значением , отличным от np.nan. Причина этого в том, что мой фрейм данных содержит столбец с датами, например:

  ID         Date         
519457    25/02/2020 10:03    
519462    25/02/2020 10:07     
519468    25/02/2020 10:12
 ...           ...

И Numpy требует, чтобы формат был числами с плавающей запятой, например:

  ID         Date         
519457    43886.41875     
519462    43886.42153     
519468    43886.425 
 ...         ...      

Как я могу внести это изменение, не изменяя саму электронную таблицу? Я видел много сообщений на форуме, в которых спрашивали об обратном и спрашивали об ошибке , и читал документы на xlrd.xldate , но не удалось это сделать, что кажется очень простым. Я уверен, что подобная проблема уже решалась, но мне не удалось найти похожий пост.

Я использую следующий код:

xls=pd.ExcelFile(r'/home/.../TwoData.xlsx')
xls.sheet_names
df=pd.read_excel(xls,"Hoja 1")

df["E_t"]=df["Date"].diff()

Любая помощь или указатели были бы очень признательны!

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

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Вы можете преобразовать дату в метку времени Unix. В python, если у вас есть объект datetime в UT C, вы можете timestamp() получить метку времени UT C. Эта функция возвращает время с начала эпохи для этого объекта datetime.

См. Пример ниже:

from datetime import timezone
dt = datetime(2015, 10, 19)
timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
print(timestamp)

1445212800.0

Пожалуйста, проверьте модуль datetime для получения дополнительной информации.

1 голос
/ 21 июня 2020

Думаю нужно:

#https://stackoverflow.com/a/9574948/2901002
@rewritten to vectorized solution
def excel_date(date1):
    temp = pd.Timestamp(1899, 12, 30)    # Note, not 31st Dec but 30th!
    delta = date1 - temp
    return (delta.dt.days) + (delta.dt.seconds) / 86400

df["Date"] = pd.to_datetime(df["Date"]).pipe(excel_date)

print (df)
       ID          Date
0  519457  43886.418750
1  519462  43886.421528
2  519468  43886.425000
...