Округление серий отметок времени панд до секунд - затем сохранение в формате csv без разрешения мс / нс - PullRequest
0 голосов
/ 07 июня 2018

У меня есть фрейм данных, df с индексом: pd.DatetimeIndex .Отдельные временные метки изменяются с 2017-12-04 08:42:12.173645000 на 2017-12-04 08:42:12 с помощью превосходной команды округления панд:

df.index = df.index.round("S")

При сохранении в csv этот формат сохраняется (это именно то, что я хочу).Мне также нужен столбец только для даты, и теперь его легко создать:

df = df.assign(DateTimeDay = df.index.round("D"))

При сохранении в csv-файле с использованием df.to_csv(), это записывает всю метку времени (2017-12-04 00:00:00), за исключением случаев, когда сохраняется ТОЛЬКО столбец .Итак, я добавляю следующую команду перед сохранением:

df["DateTimeDay"] = df["DateTimeDay"].dt.date

... и csv-файл снова выглядит красиво (2017-12-04)

Описание проблемы

Теперь перейдем к вопросу, у меня есть два других столбца с метками времени того же формата, что и выше (но разные - И - с очень небольшим количеством NaN).Я также хочу округлить их до секунд (оставив, конечно, NaN как NaN), а затем убедиться, что при записи в csv они не дополняются нулями "ниже второго разрешения".Что бы я ни пытался, я просто не могу этого сделать.

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

print(df.dtypes)
print(df.index.dtype)

... все результаты в datetime64[ns].Если я преобразую их в индекс:

df["TimeCol2"] = pd.DatetimeIndex(df["TimeCol2"]).round("s")
df["TimeCol3"] = pd.DatetimeIndex(df["TimeCol3"]).round("s")

... это работает, но csv-файл все еще дополняет их нежелательными и ненужными нулями.

Оптимальное решение : Преобразование столбцов (как указано выше) или поэлементное использование не применимо, если они не быстрые (более 100 миллионов строк).Команда моей мечты была бы такой:

df["TimeCol2"] = df["TimeCol2"].round("s") # Raises TypeError: an integer is required (got type str)

1 Ответ

0 голосов
/ 07 июня 2018

Вы можете указать формат даты для datetime dtypes при вызове to_csv:

In[170]:
df = pd.DataFrame({'date':[pd.to_datetime('2017-12-04 07:05:06.767')]})
df

Out[170]: 
                     date
0 2017-12-04 07:05:06.767

In[171]:
df.to_csv(date_format='%Y-%m-%d %H:%M:%S')

Out[171]: ',date\n0,2017-12-04 07:05:06\n'

Если вы хотите округлить значения, вам нужно round перед записью в csv:

In[173]:
df1 = df['date'].dt.round('s')
df1.to_csv(date_format='%Y-%m-%d %H:%M:%S')

Out[173]: '0,2017-12-04 07:05:07\n'
...