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