Pandas: конвертировать столбец в формат datetime [дубликат]

Если вы не хотите изменять фрейм данных, вы можете использовать пользовательский форматтер для этого столбца.

import pandas as pd
pd.options.display.float_format = '${:,.2f}'.format
df = pd.DataFrame([123.4567, 234.5678, 345.6789, 456.7890],
                  index=['foo','bar','baz','quux'],
                  columns=['cost'])


print df.to_string(formatters={'cost':'${:,.2f}'.format})

дает

        cost
foo  $123.46
bar  $234.57
baz  $345.68
quux $456.79
67
задан IanS 19 May 2017 в 13:47
поделиться

5 ответов

Начиная с версии 0.15.0 это теперь можно легко сделать, используя .dt для доступа только к компоненту даты:

df['just_date'] = df['dates'].dt.date

Вышеприведенный возвращает datetime.date dtype , если вы хотите иметь datetime64, тогда вы можете просто normalize компонент времени до полуночи, чтобы он установил все значения в 00:00:00:

df['normalised_date'] = df['dates'].dt.normalize()

Это сохраняет dtype как datetime64, но на дисплее отображается только значение date.

106
ответ дан Bronson 17 August 2018 в 17:31
поделиться
  • 1
    К сожалению, df['just_date'] имеет object dtype (и так, например, нет .dt accessor) ... любым способом избежать этого? – Pietro Battiston 18 January 2017 в 10:44
  • 2
    @PietroBattiston означает, что это, вероятно, еще строка, попробуйте конвертировать первый df['just_date'] = pd.to_datetime(df['just_date']), вам может потребоваться передать format arg в to_datetime, если он не может вывести формат – EdChum 18 January 2017 в 10:50
  • 3
    Это на самом деле datetime.date ... но это говорит, что повторное воспроизведение pd.to_datetime на нем, кажется, работает отлично, спасибо! – Pietro Battiston 18 January 2017 в 12:41
  • 4
    это df ['date']. dt.floor ('d') & lt; ---- сохраняет формат даты в формате вместо объекта. надеюсь, это поможет кому-то .. как ответил @ pietro-battiston ниже. также ser.dt.normalize () & lt; --- это работает. – ihightower 4 July 2017 в 08:18
  • 5
    @ihightower вы также можете сделать df['dates'].dt.normalize(), чтобы нормализовать время до полуночи, а также то, что OP следует, чтобы не писать компонент времени в csv – EdChum 4 July 2017 в 08:20

Преобразование в datetime64[D]:

df.dates.values.astype('M8[D]')

Хотя повторное назначение этого в DataFrame col вернет его обратно к [ns].

Если вы действительно хотите datetime.date:

dt = pd.DatetimeIndex(df.dates)
dates = np.array([datetime.date(*date_tuple) for date_tuple in zip(dt.year, dt.month, dt.day)])
2
ответ дан Dale Jung 17 August 2018 в 17:31
поделиться
  • 1
    Если вы используете astype ('M8 [D]'), он преобразует отсутствующие значения в дату начала, 1970-1-1. Вероятно, лучше просто использовать pandas.to_datetime () в настоящее время. – Stewbaca 20 July 2016 в 16:05

У Pandas DatetimeIndex и Series есть метод, называемый normalize , который делает именно то, что вы хотите.

Вы можете узнать больше об этом в this answer .

он будет записан как ser.dt.normalize()

11
ответ дан ihightower 17 August 2018 в 17:31
поделиться

Это простой способ извлечь дату:

import pandas as pd

d='2015-01-08 22:44:09' 
date=pd.to_datetime(d).date()
print(date)
2
ответ дан Nic Scozzaro 17 August 2018 в 17:31
поделиться
  • 1
    OP уже использует метод .date () в своем вопросе, поэтому это решение не отвечает на их вопрос, но мне было полезно увидеть простой пример использования метода date () как ссылку. – Nic Scozzaro 14 March 2018 в 23:58

Хотя я одобрил ответ EdChum, который является самым прямым ответом на поставленный OP вопрос, он действительно не решает проблему производительности (он все еще полагается на объекты python datetime, и, следовательно, любая операция на них будет не [gg]

Лучшей альтернативой является использование df['dates'].dt.floor('d'). Строго говоря, он не «сохраняет только дату», поскольку он просто устанавливает время на 00:00:00. Но он работает по желанию OP, когда, например:

  • печать на экран
  • сохранение в csv
  • с использованием столбца в groupby

... и это намного эффективнее, так как операция векторизована.

EDIT: на самом деле ответ, который предпочли бы OP, вероятно, последние версии pandas do not записывают время в csv, если оно 00:00:00 для всех наблюдений ».

11
ответ дан Pietro Battiston 17 August 2018 в 17:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: