it-swarm.com.ru

Как убрать секунды из даты и времени?

У меня есть следующая дата, и я попробовал следующий код,

df['start_date_time'] = ["2016-05-19 08:25:00","2016-05-19 16:00:00","2016-05-20 07:45:00","2016-05-24 12:50:00","2016-05-25 23:00:00","2016-05-26 19:45:00"]
df['start_date_time'] = pd.to_datetime([df['start_date_time']).replace(second = 0)

Я получаю следующую ошибку:

TypeError: replace() got an unexpected keyword argument 'second'
4
user7779326

Вы можете сначала использовать преобразование в numpy values, а затем усечь seconds путем приведения к <M8[m]:

df = pd.DataFrame({'start_date_time': ["2016-05-19 08:25:23","2016-05-19 16:00:45"]})
print (df)
       start_date_time
0  2016-05-19 08:25:23
1  2016-05-19 16:00:45

df['start_date_time'] = pd.to_datetime(df['start_date_time'])
df['start_date_time'] = df['start_date_time'].values.astype('<M8[m]')
print (df)
      start_date_time
0 2016-05-19 08:25:00
1 2016-05-19 16:00:00

Другое решение - создать timedelta Series из second и вычесть:

print (pd.to_timedelta(df['start_date_time'].dt.second, unit='s'))
0   00:00:23
1   00:00:45
Name: start_date_time, dtype: timedelta64[ns]

df['start_date_time'] = df['start_date_time'] - 
                        pd.to_timedelta(df['start_date_time'].dt.second, unit='s')
print (df)
      start_date_time
0 2016-05-19 08:25:00
1 2016-05-19 16:00:00

Сроки:

df = pd.DataFrame({'start_date_time': ["2016-05-19 08:25:23","2016-05-19 16:00:45"]})
df['start_date_time'] = pd.to_datetime(df['start_date_time'])

#20000 rows
df = pd.concat([df]*10000).reset_index(drop=True)


In [181]: %timeit df['start_date_time'] = df['start_date_time'] - pd.to_timedelta(df['start_date_time'].dt.second, unit='s')
100 loops, best of 3: 5.83 ms per loop

In [182]: %timeit df['start_date_time1'] = df['start_date_time'].values.astype('<M8[m]')
The slowest run took 4.21 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 638 µs per loop

In [183]: %timeit df['start_date_time2'] = df['start_date_time'].apply(lambda t: t.replace(second=0))
10 loops, best of 3: 83.4 ms per loop
1
jezrael

Установите секунды на 0

pd.to_datetime вернет datetime объекты, которые имеют second в качестве атрибута: с этим ничего не поделаешь. Вы можете установить для second значение 0, но атрибут все еще будет здесь, и стандартное представление будет по-прежнему включать в себя завершающий ':00'.

Вам необходимо применить replace к каждому элементу df:

import pandas as pd

df = pd.DataFrame({'start_date_time': ["2016-05-19 08:25:23","2016-05-19 16:00:45","2016-05-20 07:45:00","2016-05-24 12:50:00","2016-05-25 23:00:00","2016-05-26 19:45:00"]})
df['start_date_time'] = pd.to_datetime(df['start_date_time'])
df['start_date_time'] = df['start_date_time'].apply(lambda t: t.replace(second=0))

print(df)
#       start_date_time
# 0 2016-05-19 08:25:00
# 1 2016-05-19 16:00:00
# 2 2016-05-20 07:45:00
# 3 2016-05-24 12:50:00
# 4 2016-05-25 23:00:00
# 5 2016-05-26 19:45:00

:23 и :45 с первого раза были заменены на :00, но они все еще печатаются.

Удалить ':00' из строк

Если вы просто хотите получить строковое представление тех времен и проанализировать строки только для объектов datetime, чтобы удалить ':00' в конце строки, вы можете просто удалить последние 3 символа:

>>> "2016-05-19 08:25:00"[:-3]
'2016-05-19 08:25'

Вы можете применить это к каждому элементу в вашем списке перед инициализацией df['start_date_time']:

>>> start_date_time = ["2016-05-19 08:25:00","2016-05-19 16:00:00","2016-05-20 07:45:00","2016-05-24 12:50:00","2016-05-25 23:00:00","2016-05-26 19:45:00"]
>>> map(lambda s: s[:-3], start_date_time)
['2016-05-19 08:25', '2016-05-19 16:00', '2016-05-20 07:45', '2016-05-24 12:50', '2016-05-25 23:00', '2016-05-26 19:45']

Отображение времени без секунд

Если вы хотите работать с объектами datetime, но не хотите показывать секунды:

print(df['start_date_time'].apply(lambda t: t.strftime('%Y-%m-%d %H:%M')))
# 0    2016-05-19 08:25
# 1    2016-05-19 16:00
# 2    2016-05-20 07:45
# 3    2016-05-24 12:50
# 4    2016-05-25 23:00
# 5    2016-05-26 19:45
# Name: start_date_time, dtype: object
2
Eric Duminil

Вы можете вычесть секунды с помощью временной шкалы:

import datetime    
d = datetime.datetime.now() #datetime including seconds
without_seconds = d - datetime.timedelta(seconds=d.second)
1
Flurin

Сначала преобразуйте String в объект datetime, затем вы можете использовать метод replace.

from _datetime import *


df = dict()
df['start_date_time'] = ["2016-05-19 08:25:00",
                         "2016-05-19 16:00:00",
                         "2016-05-20 07:45:00",
                         "2016-05-24 12:50:00",
                         "2016-05-25 23:00:00",
                         "2016-05-26 19:45:00"]

for dt in df['start_date_time']:
    cur_dt = datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
    cur_dt = cur_dt.replace(second=0)
    print(cur_dt)

    cur_dt_without_second = cur_dt.strftime('%Y-%m-%d %H:%M')
    print(cur_dt_without_second)

-------------------
2016-05-19 08:25:00
2016-05-19 08:25
2016-05-19 16:00:00
2016-05-19 16:00
2016-05-20 07:45:00
2016-05-20 07:45
2016-05-24 12:50:00
2016-05-24 12:50
2016-05-25 23:00:00
2016-05-25 23:00
2016-05-26 19:45:00
2016-05-26 19:45
0
M. Leung

Преобразовать строку в объект datetime, а затем манипулировать этим

>>> x = ["2016-05-19 08:25:00","2016-05-19 16:00:00","2016-05-20 07:45:00","2016-05-24 12:50:00","2016-05-25 23:00:00","2016-05-26 19:45:00"]
>>> for i in x:
...  y = datetime.datetime.strptime(i, '%Y-%m-%d %H:%M:%S')
...  z = datetime.datetime.strftime(y, '%Y-%m-%d %H:%M')
...  print (y, type(y))
...  print (z, type(z))
... 
(datetime.datetime(2016, 5, 19, 8, 25), <type 'datetime.datetime'>)
('2016-05-19 08:25', <type 'str'>)
(datetime.datetime(2016, 5, 19, 16, 0), <type 'datetime.datetime'>)
('2016-05-19 16:00', <type 'str'>)
(datetime.datetime(2016, 5, 20, 7, 45), <type 'datetime.datetime'>)
('2016-05-20 07:45', <type 'str'>)
(datetime.datetime(2016, 5, 24, 12, 50), <type 'datetime.datetime'>)
('2016-05-24 12:50', <type 'str'>)
(datetime.datetime(2016, 5, 25, 23, 0), <type 'datetime.datetime'>)
('2016-05-25 23:00', <type 'str'>)
(datetime.datetime(2016, 5, 26, 19, 45), <type 'datetime.datetime'>)
('2016-05-26 19:45', <type 'str'>)
0
Rolf of Saxony

Как вы упомянули, удалили, поэтому я предположил, что вам не нужны ни секунды, ни микросекунды в результате. Если это так, то может помочь следующее:

datetime_variable.strftime("'%Y-%m-%d %H:%M'")

Если у вас есть datetime в строке, вы можете преобразовать его в datetime obj:

from dateutil import parser

datetime_variable = parser.parse(str_datetime_var)

datetime_variable.strftime("'%Y-%m-%d %H:%M'")

0
Lyncean Patel

Дайте этому шанс с:

df.index = df.index.map(lambda t: t.strftime('%Y-%m-%d %H:%M'))

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

import pandas as pd

df = pd.DataFrame({'date': ["2016-05-19 08:25:00"]})

print(df['date'].map(lambda t: t[:-3]))

Выше будет выводить:

0    2016-05-19 08:25
Name: date, dtype: object
0
user6165050