Câu trả lời:
Sử dụng 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']]
Về cơ bản tương đương với @waitingkuo, nhưng tôi sẽ sử dụng to_datetime
ở đây (nó có vẻ gọn gàng hơn một chút và cung cấp một số chức năng bổ sung, ví dụ 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
Xử lý ValueError
s
Nếu bạn gặp phải tình huống làm
df['time'] = pd.to_datetime(df['time'])
Ném một
ValueError: Unknown string format
Điều đó có nghĩa là bạn có các giá trị không hợp lệ (không thể cưỡng chế). Nếu bạn đồng ý với việc chuyển đổi chúng thành pd.NaT
, bạn có thể thêm errors='coerce'
đối số vào to_datetime
:
df['time'] = pd.to_datetime(df['time'], errors='coerce')
Tôi tưởng tượng rất nhiều dữ liệu được đưa vào Pandas từ tệp CSV, trong trường hợp đó bạn có thể chỉ cần chuyển đổi ngày trong lần đọc CSV ban đầu:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])
trong đó số 0 đề cập đến cột ngày tháng.
Bạn cũng có thể thêm , index_col=0
vào đó nếu bạn muốn ngày làm chỉ mục của mình.
Xem https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
Bây giờ bạn có thể làm df['column'].dt.date
Lưu ý rằng đối với các đối tượng datetime, nếu bạn không thấy giờ khi tất cả chúng đều là 00:00:00 thì đó không phải là gấu trúc. Đó là máy tính xách tay iPython đang cố gắng làm cho mọi thứ trông đẹp đẽ.
df[col] = pd.to_datetime(df[col])
trước tiên để chuyển đổi cột của mình thành các đối tượng thời gian ngày tháng.
dtype = object
chiếm nhiều bộ nhớ hơn đáng kể so với cột đúng datetime dtype
ở gấu trúc.
Một cách khác để làm điều này và điều này hoạt động tốt nếu bạn có nhiều cột để chuyển đổi sang ngày giờ.
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
date
chỉ có giá trị trong các cột của mình, việc chuyển đổi sang datetime sẽ chỉ giữ lại thông tin liên quan. Nếu bạn chuyển đổi rõ ràng bằng cách sử dụng df['datetime_col'].dt.date
sẽ dẫn đến một loại object
dtype; mất quản lý bộ nhớ.
Nếu bạn muốn nhận định dạng DATE chứ không phải DATETIME:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
Có thể có trường hợp ngày tháng cần được chuyển đổi sang một tần số khác. Trong trường hợp này, tôi khuyên bạn nên đặt chỉ mục theo ngày.
#set an index by dates
df.set_index(['time'], drop=True, inplace=True)
Sau đó, bạn có thể dễ dàng chuyển đổi sang loại định dạng ngày tháng mà bạn cần nhất. Dưới đây, tôi chuyển đổi tuần tự sang một số định dạng ngày, cuối cùng kết thúc bằng một bộ ngày hàng ngày vào đầu tháng.
#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)
Để ngắn gọn, tôi không cho thấy rằng tôi chạy mã sau sau mỗi dòng ở trên:
print(df.index)
print(df.index.dtype)
print(type(df.index))
Điều này cho tôi kết quả sau:
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'>
Cố gắng chuyển đổi một trong các hàng thành dấu thời gian bằng cách sử dụng hàm pd.to_datetime và sau đó sử dụng .map để ánh xạ biểu mẫu cho toàn bộ cột
# 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]