Как записать время в csv и снова прочитать как datetime64[ns, Европа/Берлин]?

#pandas #dataframe #csv

Вопрос:

Прежде чем я буду писать в csv-файл, у меня есть столбец времени в виде:

 time datetime64[ns, Europe/Berlin]  

Когда я читаю df из csv, я получаю:

 time object  

Как записать и прочитать столбцы времени того же типа, что и до процесса сохранения?

Для процесса написания у меня есть:

 df = df.astype({'time':'datetime64[ns]'})  mytz = get_localzone()  df['time'] = pd.to_datetime(df['time'] , unit='ms').dt.tz_localize('UTC').dt.tz_convert(mytz)  

Как мне написать в scv?

 df.to_csv('test.csv' , index=False)  

Как мне прочитать csv?

 df = pd.read_csv('test.csv')  

И колонка времени выглядит так:

 0 2021-09-20 00:00:00 02:00 1 2021-09-20 01:00:00 02:00  

Комментарии:

1. просто , но сложно.

2. Вам нужно отделить часовой пояс, если вы хотите сохранить «Европа/Берлин». 01:00 может привести ко многим другим странам Европы или Африки. Или вы хотели бы написать формат даты с аббревиатурой TZ в формате csv?

3. Вам не нужно pd.to_datetime после того, как вы прочитаете. Если у вас есть 01:00 в вашем csv, parse_dates вы уже преобразуете столбец в дату и время с учетом tz. Попробуйте распечатать pd.read_csv('test.csv', parse_dates=['time']).info() Это должно иметь время с учетом tz по смещению, а не по локали. Это нормально, что вы теряете информацию о локали?

4. Я получил ответ: время 1440 ненулевой объект

5. Не могли бы вы поделиться строкой to_csv , а затем, какой формат даты теперь записан в csv?

Ответ №1:

Для этого я бы использовал pd.to_pickle(path) и pd.read_pickle(path) , поскольку csv на самом деле не может хранить ничего, кроме строк и чисел. С помощью pickle он сериализует весь фрейм данных и сохраняет его так, как если бы вы только что напрямую загрузили объект python в файл и наоборот.