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_datetime
aqui (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 ValueError
s
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=0
lá 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 = object
que ocupa muito mais memória do que uma coluna verdadeira datetime dtype
em 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)
date
apenas 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.date
isso resultará em um object
dtype; 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]