Respostas:
Use astype
In [31]: df
Out[31]:
a time
0 1 2013-01-01
1 2 2013-01-02
2 3 2013-01-03
In [32]: df['time'] = df['time'].astype('datetime64[ns]')
In [33]: df
Out[33]:
a time
0 1 2013-01-01 00:00:00
1 2 2013-01-02 00:00:00
2 3 2013-01-03 00:00:00
df['time'] = [time.date() for time in df['time']]
Essencialmente equivalente a @waitingkuo, mas eu usaria to_datetimeaqui (parece um pouco mais limpo e oferece algumas funcionalidades adicionais, por exemplo dayfirst):
In [11]: df
Out[11]:
a time
0 1 2013-01-01
1 2 2013-01-02
2 3 2013-01-03
In [12]: pd.to_datetime(df['time'])
Out[12]:
0 2013-01-01 00:00:00
1 2013-01-02 00:00:00
2 2013-01-03 00:00:00
Name: time, dtype: datetime64[ns]
In [13]: df['time'] = pd.to_datetime(df['time'])
In [14]: df
Out[14]:
a time
0 1 2013-01-01 00:00:00
1 2 2013-01-02 00:00:00
2 3 2013-01-03 00:00:00
Lidando com ValueErrors
Se você se deparar com uma situação em que fazer
df['time'] = pd.to_datetime(df['time'])
Joga um
ValueError: Unknown string format
Isso significa que você tem valores inválidos (não coercíveis). Se concordar com a conversão deles para pd.NaT, você pode adicionar um errors='coerce'argumento para to_datetime:
df['time'] = pd.to_datetime(df['time'], errors='coerce')
Imagino que muitos dados entrem no Pandas a partir de arquivos CSV; nesse caso, você pode simplesmente converter a data durante a leitura inicial do CSV:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])onde o 0 se refere à coluna em que a data está.
Você também pode adicionar , index_col=0lá se quiser que a data seja o seu índice.
Veja https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
Agora você pode fazer df['column'].dt.date
Observe que, para objetos datetime, se você não vir a hora em que são todos 00:00:00, isso não é pandas. Esse é o notebook iPython tentando fazer as coisas parecerem bonitas.
df[col] = pd.to_datetime(df[col])primeiro para converter sua coluna em objetos de data e hora.
dtype = objectque ocupa muito mais memória do que uma coluna verdadeira datetime dtypeem pandas.
Outra maneira de fazer isso funciona bem se você tiver várias colunas para converter em data e hora.
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
dateapenas valores em suas colunas, a conversão para data e hora reterá apenas as informações pertinentes. Se você converter explicitamente usando df['datetime_col'].dt.dateisso resultará em um objectdtype; perda no gerenciamento de memória.
Se você deseja obter o formato DATE e não DATETIME:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
Pode ser que as datas precisem ser convertidas para uma frequência diferente. Nesse caso, sugiro definir um índice por datas.
#set an index by dates
df.set_index(['time'], drop=True, inplace=True)
Depois disso, você pode converter mais facilmente para o tipo de formato de data de que mais precisa. Abaixo, eu converto sequencialmente para vários formatos de data, terminando com um conjunto de datas diárias no início do mês.
#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)
#Convert to monthly dates
df.index = df.index.to_period(freq='M')
#Convert to strings
df.index = df.index.strftime('%Y-%m')
#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)
Para resumir, não mostro que executo o código a seguir após cada linha acima:
print(df.index)
print(df.index.dtype)
print(type(df.index))
Isso me dá a seguinte saída:
Index(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='object', name='time')
object
<class 'pandas.core.indexes.base.Index'>
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='datetime64[ns]', name='time', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
PeriodIndex(['2013-01', '2013-01', '2013-01'], dtype='period[M]', name='time', freq='M')
period[M]
<class 'pandas.core.indexes.period.PeriodIndex'>
Index(['2013-01', '2013-01', '2013-01'], dtype='object')
object
<class 'pandas.core.indexes.base.Index'>
DatetimeIndex(['2013-01-01', '2013-01-01', '2013-01-01'], dtype='datetime64[ns]', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
Tente converter uma das linhas em carimbo de data / hora usando a função pd.to_datetime e, em seguida, use .map para mapear o formulário para a coluna inteira
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 startDay 110526 non-null object
1 endDay 110526 non-null object
import pandas as pd
df['startDay'] = pd.to_datetime(df.startDay)
df['endDay'] = pd.to_datetime(df.endDay)
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 startDay 110526 non-null datetime64[ns]
1 endDay 110526 non-null datetime64[ns]