Как преобразовать столбцы даты из типа объекта в тип даты в Python - PullRequest
0 голосов
/ 17 мая 2018

У меня есть этот фрейм данных, где столбцы даты имеют тип 'datetime'

datetime64[ns]
2014-04-30T00:00:00 000000000

Теперь я хочу дату в этом формате - 2014-04-30. Поэтому я использовал ниже код

df['StartingDate2'] = XY['StartingDate'].dt.strftime('%m/%d/%Y')

Теперь это работает точно, но конвертирует мою дату в тип объекта. Я прочитал здесь , что в Python даты - это объекты. Но я хочу записать свой окончательный фрейм данных в виде таблицы с красным смещением, и поэтому мне нужно, чтобы мои столбцы даты были определены как дата для моего фрейма данных Python. Будем очень благодарны за любые предложения о том, как это сделать.


Обновление:

образец кадра данных

p1 = {'name': ['johnny', 'tommy', 'bobby', 'rocky', 'jimmy'], 'StartingDate': ['2015-07-14T00:00:00.000000000', '2013-10-30T00:00:00.000000000', '2014-04-30T00:00:00.000000000', '2014-01-27T00:00:00.000000000', '2016-01-15T00:00:00.000000000'], 'Address': ['NY', 'NJ', 'PA', 'NY', 'CA'], 'comment1': ['Very good performance', 'N/A', 'Need to work hard', 'No Comment', 'Not satisfactory'], 'comment2': ['good', 'Meets Expectation', 'N', 'N/A', 'Incompetence']}
XY = pd.DataFrame(data = p1)
XY['today'] = datetime.datetime.now()

Когда я использую решение to_datetime () - оно не работает

XY['today2'] = pd.to_datetime(XY['today'],  format = '%m/%d/%Y')
XY['StartingDate2'] = pd.to_datetime(XY['today'],  format = '%m/%d/%Y')

В качестве альтернативы - это работает, когда strftime () и to_datetime () используются в комбинации.

XY['StartingDate2'] = XY['StartingDate2'].dt.strftime('%m/%d/%Y')
XY['StartingDate2'] = pd.to_datetime(XY['StartingDate2'])

Но хотя это решение работает для данных примера, у меня оно не работает. Данные у меня выглядят так -

array(['2015-09-29T14:34:39.000000000', '2015-10-07T14:13:03.000000000',
   '2015-10-07T19:17:50.000000000', ...,
   '2017-12-05T14:06:42.000000000', '2017-12-06T16:36:44.000000000',
   '2017-12-06T18:26:49.000000000'], dtype='datetime64[ns]'

Ответы [ 2 ]

0 голосов
/ 17 мая 2018
df['StartingDate2'] = pd.to_datetime(XY['StartingDate'])
0 голосов
/ 17 мая 2018

Решение состоит в том, чтобы использовать to_datetime

s = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000'])
s
0    3/11/2000
1    3/12/2000
2    3/13/2000
dtype: object

pd.to_datetime(s)
0   2000-03-11
1   2000-03-12
2   2000-03-13
dtype: datetime64[ns]

Таким образом, в вашей ситуации вы можете написать

df['StartingDate2'] = pd.to_datetime(XY['StartingDate'], format='%m/%d/%Y')

, и фактически вы можете пренебречь ключевым словом форматаВот.Но если вы предоставите его, вы получите огромное увеличение скорости.

Тесты

s = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000']*1000)

Без формата

%%timeit
pd.to_datetime(s)
453 ms ± 3.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

С форматом

%%timeit
pd.to_datetime(s, format='%m/%d/%Y')
9.68 ms ± 44.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Примечание для меня: всегда указывайте строку формата, если это возможно

Ответ на обновленный вопрос

Вы можете использовать время даты floor функция

df = pd.DataFrame(pd.to_datetime(['2015-09-29T14:34:39.000000000', '2015-10-07T14:13:03.000000000',
   '2015-10-07T19:17:50.000000000',
   '2017-12-05T14:06:42.000000000', '2017-12-06T16:36:44.000000000',
   '2017-12-06T18:26:49.000000000']), columns=['A'])

df['B'] = df['A'].dt.floor('d')
df.dtypes

A    datetime64[ns]
B    datetime64[ns]
dtype: object

df

                      A          B
0   2015-09-29 14:34:39 2015-09-29
1   2015-10-07 14:13:03 2015-10-07
2   2015-10-07 19:17:50 2015-10-07
3   2017-12-05 14:06:42 2017-12-05
4   2017-12-06 16:36:44 2017-12-06
5   2017-12-06 18:26:49 2017-12-06
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...