Если вы не хотите изменять фрейм данных, вы можете использовать пользовательский форматтер для этого столбца.
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
Начиная с версии 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
.
Преобразование в 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)])
У Pandas DatetimeIndex
и Series
есть метод, называемый normalize
, который делает именно то, что вы хотите.
Вы можете узнать больше об этом в this answer .
он будет записан как ser.dt.normalize()
Это простой способ извлечь дату:
import pandas as pd
d='2015-01-08 22:44:09'
date=pd.to_datetime(d).date()
print(date)
Хотя я одобрил ответ EdChum, который является самым прямым ответом на поставленный OP вопрос, он действительно не решает проблему производительности (он все еще полагается на объекты python datetime
, и, следовательно, любая операция на них будет не [gg]
Лучшей альтернативой является использование df['dates'].dt.floor('d')
. Строго говоря, он не «сохраняет только дату», поскольку он просто устанавливает время на 00:00:00
. Но он работает по желанию OP, когда, например:
groupby
... и это намного эффективнее, так как операция векторизована.
EDIT: на самом деле ответ, который предпочли бы OP, вероятно, последние версии pandas
do not записывают время в csv, если оно 00:00:00
для всех наблюдений ».
date_format='iso'
?! По умолчанию он просто выводит секунды с эпохи.
– Pietro Battiston
20 May 2017 в 06:40
dt.normalize()
в серии длиннее нескольких сотен элементов.
– C8H10N4O2
21 July 2017 в 20:20
df['just_date']
имеетobject
dtype (и так, например, нет.dt
accessor) ... любым способом избежать этого? – Pietro Battiston 18 January 2017 в 10:44df['just_date'] = pd.to_datetime(df['just_date'])
, вам может потребоваться передатьformat
arg вto_datetime
, если он не может вывести формат – EdChum 18 January 2017 в 10:50datetime.date
... но это говорит, что повторное воспроизведениеpd.to_datetime
на нем, кажется, работает отлично, спасибо! – Pietro Battiston 18 January 2017 в 12:41df['dates'].dt.normalize()
, чтобы нормализовать время до полуночи, а также то, что OP следует, чтобы не писать компонент времени в csv – EdChum 4 July 2017 в 08:20