Python: уменьшает точность pandas временную шкалу данных

Здравствуйте, у меня есть следующий файл данных

df = 

       Record_ID       Time
        94704   2014-03-10 07:19:19.647342
        94705   2014-03-10 07:21:44.479363
        94706   2014-03-10 07:21:45.479581
        94707   2014-03-10 07:21:54.481588
        94708   2014-03-10 07:21:55.481804

Можно ли иметь следующие?

df1 = 

       Record_ID       Time
        94704   2014-03-10 07:19:19
        94705   2014-03-10 07:21:44
        94706   2014-03-10 07:21:45
        94707   2014-03-10 07:21:54
        94708   2014-03-10 07:21:55

Ответ 1

Вы можете преобразовать базовые значения datetime64[ns] в значения datetime64[s], используя astype:

In [11]: df['Time'] = df['Time'].astype('datetime64[s]')

In [12]: df
Out[12]: 
   Record_ID                Time
0      94704 2014-03-10 07:19:19
1      94705 2014-03-10 07:21:44
2      94706 2014-03-10 07:21:45
3      94707 2014-03-10 07:21:54
4      94708 2014-03-10 07:21:55

Обратите внимание, что, поскольку Pandas Series и DataFrames хранят все значения даты и времени как datetime64[ns], эти значения datetime64[s] автоматически преобразуются обратно в datetime64[ns], поэтому конечный результат по-прежнему сохраняется как значения datetime64[ns], но вызов astype приводит к удалению дробной части секунд.

Если вы хотите иметь массив NumPy со значениями datetime64[s], вы можете использовать df['Time'].values.astype('datetime64[s]').

Ответ 2

Если вам действительно нужно удалить часть microsecond в datetime, вы можете использовать метод Timestamp.replace наряду с Series.apply метод для применения его по серии, чтобы заменить часть microsecond на 0. Пример -

df['Time'] = df['Time'].apply(lambda x: x.replace(microsecond=0))

Демо -

In [25]: df
Out[25]:
   Record_ID                       Time
0      94704 2014-03-10 07:19:19.647342
1      94705 2014-03-10 07:21:44.479363
2      94706 2014-03-10 07:21:45.479581
3      94707 2014-03-10 07:21:54.481588
4      94708 2014-03-10 07:21:55.481804

In [26]: type(df['Time'][0])
Out[26]: pandas.tslib.Timestamp

In [27]: df['Time'] = df['Time'].apply(lambda x: x.replace(microsecond=0))

In [28]: df
Out[28]:
   Record_ID                Time
0      94704 2014-03-10 07:19:19
1      94705 2014-03-10 07:21:44
2      94706 2014-03-10 07:21:45
3      94707 2014-03-10 07:21:54
4      94708 2014-03-10 07:21:55

Ответ 3

Для панд версии 0.24.0 или выше вы можете просто установить параметр freq в функции ceil(), чтобы получить требуемую прецизионность:

df['Time'] = df.Time.dt.ceil(freq='s')  

In [28]: df
Out[28]:
   Record_ID                Time
0      94704 2014-03-10 07:19:19
1      94705 2014-03-10 07:21:44
2      94706 2014-03-10 07:21:45
3      94707 2014-03-10 07:21:54
4      94708 2014-03-10 07:21:55