Chuyển đổi chuỗi thành datetime


2183

Tôi đã có một danh sách lớn các ngày tháng như thế này dưới dạng chuỗi:

Jun 1 2005  1:33PM
Aug 28 1999 12:00AM

Tôi sẽ chuyển những thứ này trở lại vào các trường datetime thích hợp trong cơ sở dữ liệu vì vậy tôi cần phải biến chúng thành các đối tượng datetime thực.

Điều này sẽ thông qua ORM của Django vì vậy tôi không thể sử dụng SQL để thực hiện chuyển đổi khi chèn.


6
Trừ khi bạn chắc chắn một định dạng xử lý mọi thời gian một ngày (không '', không NaN, không hoàn chỉnh, không khớp định dạng, không có ký tự kéo dài, múi giờ, dấu thời gian microsecond hoặc văn bản khác ...), ngoại lệ strptime()sẽ lái bạn hạt, trừ khi bạn bọc nó. Xem câu trả lời của tôi, dựa trên câu trả lời của Or Weis cho điều này
smci

Cách tiếp cận lười biếng nhất, có thể sử dụng rộng rãi nhất mà tôi biết là dateparser (kiểm tra blog.scrapinghub.com/2015/11/09/ trên ). Nó hoạt động ngay cả với các biểu thức thời gian ngôn ngữ tự nhiên trong một số ngôn ngữ ngoài hộp. Tôi đoán nó có thể chậm mặc dù.
Armando

Có một liên kết hữu ích ở đây: stackabuse.com/converting-strings-to-datetime-in-python
Đi MYWay

Câu trả lời:


3461

datetime.strptimelà thói quen chính để phân tích chuỗi thành datetimes. Nó có thể xử lý tất cả các loại định dạng, với định dạng được xác định bởi một chuỗi định dạng bạn cung cấp cho nó:

from datetime import datetime

datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

datetimeĐối tượng kết quả là múi giờ ngây thơ.

Liên kết:

  • Tài liệu Python cho strptime: Python 2 , Python 3

  • Tài liệu Python cho strptime/ strftimeđịnh dạng chuỗi: Python 2 , Python 3

  • strftime.org cũng là một tài liệu tham khảo thực sự tốt cho strftime

Ghi chú:

  • strptime = "thời gian phân tích chuỗi"
  • strftime = "thời gian định dạng chuỗi"
  • Phát âm thành tiếng hôm nay và bạn sẽ không phải tìm kiếm lại sau 6 tháng nữa.

7
'% b', '% p' ​​có thể thất bại ở miền địa phương không phải tiếng Anh.
jfs

15
@User Bạn sẽ phải biết trước để loại trừ phần đó của chuỗi định dạng, nhưng nếu bạn muốn datethay vì một datetime, hãy datetimexử lý nó một cách độc đáo: datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)
Izkata

14
Nếu bạn biết chuỗi đại diện cho một datetime trong UTC, bạn có thể nhận được một datetimeđối tượng nhận biết múi giờ bằng cách thêm dòng này trong Python 3:from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)
Flimm

111
Tôi đang tìm kiếm"%Y-%m-%d %H:%M:%S"
Martin Thoma

4
@AminahNuraini Tôi đã giải quyết một vấn đề tương tự bằng cách làm from datetime import datetimethay vì chỉ import datetime.
Max Strater

831

Sử dụng thư viện dateutil của bên thứ ba :

from dateutil import parser
parser.parse("Aug 28 1999 12:00AM")  # datetime.datetime(1999, 8, 28, 0, 0)

Nó có thể xử lý hầu hết các định dạng ngày, bao gồm cả định dạng bạn cần phân tích. Nó thuận tiện hơn nhiều so strptimevới việc nó có thể đoán đúng định dạng hầu hết thời gian.

Nó rất hữu ích cho việc viết bài kiểm tra, trong đó khả năng đọc quan trọng hơn hiệu suất.

Bạn có thể cài đặt nó với:

pip install python-dateutil

86
Xin lưu ý rằng đối với số lượng dữ liệu lớn, đây có thể không phải là cách tối ưu nhất để tiếp cận vấn đề. Đoán định dạng mỗi lần có thể chậm kinh khủng.
Paweł Polewicz

14
Điều này là tốt nhưng sẽ tốt nếu có một giải pháp được tích hợp thay vì phải đến bên thứ ba.
brian buck

1
Khi tôi cố gắng phân tích "jan thứ 32", nó sẽ trả về cho tôi "2032-01-06" .. không đúng. Có cách nào để kiểm tra xem chuỗi có phải là ngày hợp lệ hay không
Kartik Domadiya

6
@Reef: chậm gấp 5 lần theo điểm chuẩn nhanh và bẩn của tôi. Không quá chậm khủng khiếp như tôi mong đợi.
Antony Hatchkins

2
Có vấn đề riêng của nó - ví dụ như, âm thầm bỏ thông tin múi giờ theo thời gian: thử trình phân tích cú pháp.parse ('15: 55EST ') và so sánh với trình phân tích cú pháp.parse ('15 .55CST') làm ví dụ
F1Rumors

490

Kiểm tra strptime trong thời gian mô-đun. Đó là nghịch đảo của strftime .

$ python
>>> import time
>>> my_time = time.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
time.struct_time(tm_year=2005, tm_mon=6, tm_mday=1,
                 tm_hour=13, tm_min=33, tm_sec=0,
                 tm_wday=2, tm_yday=152, tm_isdst=-1)

timestamp = time.mktime(my_time)
# convert time object to datetime
from datetime import datetime
my_datetime = datetime.fromtimestamp(timestamp)
# convert time object to date
from datetime import date
my_date = date.fromtimestamp(timestamp)

16
Theo những gì tôi hiểu, câu trả lời này chỉ đưa ra các đối tượng thời gian, không phải đối tượng thời gian - đó là lý do tại sao câu trả lời sẽ bị chôn vùi so với câu trả lời của Patrick.
Alexander Bird

Có cách nào để đặt định dạng datetime mặc định của DateTimeField không?
kingpin

3
Như Alexander đã nói, điều này trả về struct_time, không phải datetime. Tất nhiên bạn có thể chuyển đổi nó thành một datetime, nhưng câu trả lời của Patrick thì thẳng hơn nếu bạn muốn một đối tượng datetime cuối cùng.
Leandro Alves

Không có gì giống như strtotime trong thư viện python tiêu chuẩn, nhưng dateutil có một trình phân tích cú pháp nhận ra rất nhiều định dạng ngày nỗ lực tốt nhất.
Geoff Gerrietts

1
@BenBlank: '% b', '% p' ​​có thể không thành công ở địa phương không phải tiếng Anh.
jfs

113

Tôi đã kết hợp một dự án có thể chuyển đổi một số biểu thức thực sự gọn gàng. Kiểm tra dấu thời gian .

Dưới đây là một số ví dụ dưới đây:

pip install timestring
>>> import timestring
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm')
<timestring.Date 2015-08-15 20:40:00 4491909392>
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm').date
datetime.datetime(2015, 8, 15, 20, 40)
>>> timestring.Range('next week')
<timestring.Range From 03/10/14 00:00:00 to 03/03/14 00:00:00 4496004880>
>>> (timestring.Range('next week').start.date, timestring.Range('next week').end.date)
(datetime.datetime(2014, 3, 10, 0, 0), datetime.datetime(2014, 3, 14, 0, 0))

2
Ồ Ồ Ồ Ồ Điều này thật dễ dàng. Tôi đã có một chuỗi thời gian và tôi chỉ muốn rút ra một năm. import timestring timestring.Date('27 Mar 2014 12:32:29 GMT').yearĐơn giản như: lib này làm cho nó dễ dàng! Cảm ơn bạn.
brandonjp

Rất hoan nghênh bạn. Tôi rất thích ý kiến ​​và ý tưởng của bạn về việc cải thiện gói này. Hãy cho tôi biết, sử dụng các vấn đề github. Cảm ơn!
Steve Đỉnh

Hi steve, mô-đun là tuyệt vời. Sẽ rất tốt nếu có một thuộc tính chuỗi ngày trong tuần.
Mặt

1
Nó không chuyển đổi, chẳng hạn như '5 tháng 2 năm 2017' và '5 tháng 2 năm 2017' (là các định dạng phổ biến trong một số vòng kết nối và IMO một số định dạng ngày tốt nhất để rõ ràng và dễ đọc). Nó lưu trữ chúng như 2017-02-01. Tương tự cho ngày 5 tháng 2 năm 2017 (tuy nhiên, ngày 2 tháng 2 năm 2017 chính xác); cả hai định dạng cuối cùng này đều không phải là định dạng mà tôi từng thấy quen thuộc với kiến ​​thức của mình, nhưng tôi nghĩ dù sao tôi cũng chỉ ra nó.
Brōtsyorfuzthrāx

2
CẢNH BÁO: Gói này dường như không được duy trì hoặc cải thiện tại bất kỳ thời điểm nào trong 5 năm qua và thường xuyên phân tích cú pháp rõ ràng là ngày không chính xác. Ví dụ, khởi tạo Date("20180912")bằng cách nào đó phân tích giá trị của 2018-11-21. Sử dụng có nguy cơ của riêng bạn.
bsplumping

54

Hãy nhớ điều này và bạn không cần phải nhầm lẫn trong chuyển đổi datetime một lần nữa.

Chuỗi đối tượng datetime = strptime

đối tượng datetime sang các định dạng khác = strftime

Jun 1 2005 1:33PM

bằng với

%b %d %Y %I:%M%p

% b Tháng là tên viết tắt của miền địa phương (Jun)

% d Ngày trong tháng dưới dạng số thập phân có đệm (1)

% Y Năm với thế kỷ là số thập phân (2015)

% I Hour (đồng hồ 12 giờ) dưới dạng số thập phân không có đệm (01)

% M Phút dưới dạng số thập phân có đệm (33)

% p Địa điểm tương đương với AM hoặc PM (PM)

Vì vậy, bạn cần strptime tức là chuyển đổi stringsang

>>> dates = []
>>> dates.append('Jun 1 2005  1:33PM')
>>> dates.append('Aug 28 1999 12:00AM')
>>> from datetime import datetime
>>> for d in dates:
...     date = datetime.strptime(d, '%b %d %Y %I:%M%p')
...     print type(date)
...     print date
... 

Đầu ra

<type 'datetime.datetime'>
2005-06-01 13:33:00
<type 'datetime.datetime'>
1999-08-28 00:00:00

Điều gì sẽ xảy ra nếu bạn có định dạng ngày khác nhau, bạn có thể sử dụng panda hoặc dateutil.parse

>>> import dateutil
>>> dates = []
>>> dates.append('12 1 2017')
>>> dates.append('1 1 2017')
>>> dates.append('1 12 2017')
>>> dates.append('June 1 2017 1:30:00AM')
>>> [parser.parse(x) for x in dates]

Ra ngoài

[datetime.datetime(2017, 12, 1, 0, 0), datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 12, 0, 0), datetime.datetime(2017, 6, 1, 1, 30)]

% S trong vài giây dưới dạng thập phân
lạc quan

1
Sẽ không %bphá vỡ nếu bạn phân tích một ngày tiếng Anh trên một máy không có ngôn ngữ tiếng Anh?
bfontaine

48

Trong Python> = 3.7.0,

để chuyển đổi chuỗi YYYY-MM-DD thành đối tượng datetime , datetime.fromisoformatcó thể được sử dụng.

>>> from datetime import datetime

>>> date_string = "2012-12-12 10:10:10"
>>> print (datetime.fromisoformat(date_string))
>>> 2012-12-12 10:10:10

32

Nhiều dấu thời gian có múi giờ ngụ ý. Để đảm bảo mã của bạn sẽ hoạt động ở mọi múi giờ, bạn nên sử dụng UTC bên trong và đính kèm múi giờ mỗi khi có vật thể lạ xâm nhập vào hệ thống.

Python 3.2+:

>>> datetime.datetime.strptime(
...     "March 5, 2014, 20:13:50", "%B %d, %Y, %H:%M:%S"
... ).replace(tzinfo=datetime.timezone(datetime.timedelta(hours=-3)))

3
Tại sao bạn giữ phương thức xấu xí và đôi khi sai ( mktime()trong quá trình chuyển đổi DST) nếu bạn biết phương thức thứ 2 ( datetime.strptime())? Nếu bạn muốn tránh một ngoại lệ trong một giây nhảy vọt (phương pháp thứ 2 không thành công) thì bạn có thể sử dụng calendar.timegmthay thế:(datetime(1970,1,1)+timedelta(seconds=timegm(time.strptime(..)))).replace(tzinfo=timezone(timedelta(-3)))
jfs

29

Dưới đây là hai giải pháp sử dụng Pandas để chuyển đổi ngày được định dạng dưới dạng chuỗi thành các đối tượng datetime.date.

import pandas as pd

dates = ['2015-12-25', '2015-12-26']

# 1) Use a list comprehension.
>>> [d.date() for d in pd.to_datetime(dates)]
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

# 2) Convert the dates to a DatetimeIndex and extract the python dates.
>>> pd.DatetimeIndex(dates).date.tolist()
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

Thời gian

dates = pd.DatetimeIndex(start='2000-1-1', end='2010-1-1', freq='d').date.tolist()

>>> %timeit [d.date() for d in pd.to_datetime(dates)]
# 100 loops, best of 3: 3.11 ms per loop

>>> %timeit pd.DatetimeIndex(dates).date.tolist()
# 100 loops, best of 3: 6.85 ms per loop

Và đây là cách chuyển đổi các ví dụ về thời gian ban đầu của OP:

datetimes = ['Jun 1 2005  1:33PM', 'Aug 28 1999 12:00AM']

>>> pd.to_datetime(datetimes).to_pydatetime().tolist()
[datetime.datetime(2005, 6, 1, 13, 33), 
 datetime.datetime(1999, 8, 28, 0, 0)]

Có nhiều tùy chọn để chuyển đổi từ chuỗi sang Dấu thời gian Pandas bằng cách sử dụng to_datetime, vì vậy hãy kiểm tra tài liệu nếu bạn cần bất cứ điều gì đặc biệt.

Tương tự, Dấu thời gian có nhiều thuộc tính và phương thức có thể được truy cập ngoài.date


26

Cá nhân tôi thích giải pháp sử dụng parsermô-đun, đây là Câu trả lời thứ hai cho câu hỏi này và rất hay, vì bạn không phải xây dựng bất kỳ chuỗi ký tự nào để làm cho nó hoạt động. NHƯNG , một nhược điểm là nó chậm hơn 90% so với câu trả lời được chấp nhận strptime.

from dateutil import parser
from datetime import datetime
import timeit

def dt():
    dt = parser.parse("Jun 1 2005  1:33PM")
def strptime():
    datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

print(timeit.timeit(stmt=dt, number=10**5))
print(timeit.timeit(stmt=strptime, number=10**5))
>10.70296801342902
>1.3627995655316933

Miễn là bạn không làm điều này hàng triệu lần nhiều lần, tôi vẫn nghĩ rằng parserphương pháp này thuận tiện hơn và sẽ tự động xử lý hầu hết các định dạng thời gian.


24

Một cái gì đó không được đề cập ở đây và rất hữu ích: thêm một hậu tố cho ngày. Tôi đã tách logic logic hậu tố để bạn có thể sử dụng nó cho bất kỳ số nào bạn thích, không chỉ ngày tháng.

import time

def num_suffix(n):
    '''
    Returns the suffix for any given int
    '''
    suf = ('th','st', 'nd', 'rd')
    n = abs(n) # wise guy
    tens = int(str(n)[-2:])
    units = n % 10
    if tens > 10 and tens < 20:
        return suf[0] # teens with 'th'
    elif units <= 3:
        return suf[units]
    else:
        return suf[0] # 'th'

def day_suffix(t):
    '''
    Returns the suffix of the given struct_time day
    '''
    return num_suffix(t.tm_mday)

# Examples
print num_suffix(123)
print num_suffix(3431)
print num_suffix(1234)
print ''
print day_suffix(time.strptime("1 Dec 00", "%d %b %y"))
print day_suffix(time.strptime("2 Nov 01", "%d %b %y"))
print day_suffix(time.strptime("3 Oct 02", "%d %b %y"))
print day_suffix(time.strptime("4 Sep 03", "%d %b %y"))
print day_suffix(time.strptime("13 Nov 90", "%d %b %y"))
print day_suffix(time.strptime("14 Oct 10", "%d %b %y"))​​​​​​​

17
In [34]: import datetime

In [35]: _now = datetime.datetime.now()

In [36]: _now
Out[36]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [37]: print _now
2016-01-19 09:47:00.432000

In [38]: _parsed = datetime.datetime.strptime(str(_now),"%Y-%m-%d %H:%M:%S.%f")

In [39]: _parsed
Out[39]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [40]: assert _now == _parsed

16

Django Timezone nhận biết ví dụ đối tượng datetime.

import datetime
from django.utils.timezone import get_current_timezone
tz = get_current_timezone()

format = '%b %d %Y %I:%M%p'
date_object = datetime.datetime.strptime('Jun 1 2005  1:33PM', format)
date_obj = tz.localize(date_object)

Chuyển đổi này rất quan trọng đối với Django và Python khi bạn có USE_TZ = True:

RuntimeWarning: DateTimeField MyModel.created received a naive datetime (2016-03-04 00:00:00) while time zone support is active.

12

Tạo một chức năng tiện ích nhỏ như:

def date(datestr="", format="%Y-%m-%d"):
    from datetime import datetime
    if not datestr:
        return datetime.today().date()
    return datetime.strptime(datestr, format).date()

Điều này đủ linh hoạt:

  • Nếu bạn không vượt qua bất kỳ đối số, nó sẽ trả về ngày hôm nay.
  • Có một định dạng ngày làm mặc định mà bạn có thể ghi đè.
  • Bạn có thể dễ dàng sửa đổi nó để trả về một datetime.

2
formatlà một từ dành riêng trong python và không nên được sử dụng làm tên biến.
băm nhỏ

12

Nó sẽ giúp ích cho việc chuyển đổi chuỗi thành datetime và cả với múi giờ

def convert_string_to_time(date_string, timezone):
    from datetime import datetime
    import pytz
    date_time_obj = datetime.strptime(date_string[:26], '%Y-%m-%d %H:%M:%S.%f')
    date_time_obj_timezone = pytz.timezone(timezone).localize(date_time_obj)

    return date_time_obj_timezone

date = '2018-08-14 13:09:24.543953+00:00'
TIME_ZONE = 'UTC'
date_time_obj_timezone = convert_string_to_time(date, TIME_ZONE)

9

mũi tên cung cấp nhiều chức năng hữu ích cho ngày và thời gian. Đoạn mã này cung cấp câu trả lời cho câu hỏi và cho thấy rằng mũi tên cũng có khả năng định dạng ngày dễ dàng và hiển thị thông tin cho các địa phương khác.

>>> import arrow
>>> dateStrings = [ 'Jun 1  2005 1:33PM', 'Aug 28 1999 12:00AM' ]
>>> for dateString in dateStrings:
...     dateString
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').datetime
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').format('ddd, Do MMM YYYY HH:mm')
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').humanize(locale='de')
...
'Jun 1  2005 1:33PM'
datetime.datetime(2005, 6, 1, 13, 33, tzinfo=tzutc())
'Wed, 1st Jun 2005 13:33'
'vor 11 Jahren'
'Aug 28 1999 12:00AM'
datetime.datetime(1999, 8, 28, 0, 0, tzinfo=tzutc())
'Sat, 28th Aug 1999 00:00'
'vor 17 Jahren'

Xem http://arrow.readthedocs.io/en/latest/ để biết thêm.


6

Bạn có thể sử dụng easy_date để làm cho nó dễ dàng:

import date_converter
converted_date = date_converter.string_to_datetime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

4

Nếu bạn chỉ muốn định dạng ngày thì bạn có thể chuyển đổi thủ công bằng cách chuyển các trường riêng lẻ của mình như:

>>> import datetime
>>> date = datetime.date(int('2017'),int('12'),int('21'))
>>> date
datetime.date(2017, 12, 21)
>>> type(date)
<type 'datetime.date'>

Bạn có thể chuyển các giá trị chuỗi phân tách của mình để chuyển đổi nó thành loại ngày như:

selected_month_rec = '2017-09-01'
date_formate = datetime.date(int(selected_month_rec.split('-')[0]),int(selected_month_rec.split('-')[1]),int(selected_month_rec.split('-')[2]))

Bạn sẽ nhận được giá trị kết quả ở định dạng ngày.


2

Bạn cũng có thể kiểm tra dateparser

dateparser cung cấp các mô-đun để dễ dàng phân tích ngày địa phương hóa trong hầu hết các định dạng chuỗi thường thấy trên các trang web.

Tải về:

$ pip install dateparser

Đây là cách tôi dễ dàng nhất để phân tích ngày tháng.

Cách đơn giản nhất là sử dụng dateparser.parsechức năng, bao bọc hầu hết các chức năng trong mô-đun.

Mã mẫu:

import dateparser

t1 = 'Jun 1 2005  1:33PM'
t2 = 'Aug 28 1999 12:00AM'

dt1 = dateparser.parse(t1)
dt2 = dateparser.parse(t2)

print(dt1)
print(dt2)

Đầu ra:

2005-06-01 13:33:00
1999-08-28 00:00:00

1

Xem câu trả lời của tôi .

Trong dữ liệu trong thế giới thực, đây là một vấn đề thực sự: nhiều định dạng ngày, không khớp, không đầy đủ, không nhất quán và đa ngôn ngữ / khu vực, thường được trộn tự do trong một tập dữ liệu. Không ổn khi mã sản xuất thất bại, huống chi là hạnh phúc như một con cáo.

Chúng ta cần thử ... bắt nhiều định dạng datetime fmt1, fmt2, ..., fmtn và triệt tiêu / xử lý các ngoại lệ (từ strptime()) cho tất cả các định dạng không khớp (và đặc biệt, tránh cần một thang thử thụt sâu yukky n mệnh đề ..catch). Từ giải pháp của tôi

def try_strptime(s, fmts=['%d-%b-%y','%m/%d/%Y']):
    for fmt in fmts:
        try:
            return datetime.strptime(s, fmt)
        except:
            continue

    return None # or reraise the ValueError if no format matched, if you prefer

Câu hỏi không nói gì về "nhiều định dạng ngày, không khớp, không đầy đủ, không nhất quán và đa ngôn ngữ / khu vực", v.v ... Đây có thể là một vấn đề thực sự, nhưng không liên quan ở đây.
RoG

1
@RoG: Họ không bao giờ nói họ không, và nó ngụ ý rằng họ là: "danh sách lớn ... cơ sở dữ liệu" . Trong hầu hết mọi cơ sở dữ liệu / logfile mà tôi đã làm việc (ngay cả kích thước nhỏ), có nhiều định dạng ngày, định danh múi giờ, MM-DD, v.v. Trong sản xuất, không thể chấp nhận viết mã giòn mà mã hóa cứng ở định dạng và gặp sự cố khi ngoại lệ nó không có được định dạng như mong đợi (thậm chí trả về Không hoặc '' được chấp nhận hơn). Do đó cần nhiều định dạng. Do đó, điều này không giải quyết được câu hỏi và tôi đã dành một chút thời gian để tìm ra cách Pythonic nhất để xử lý lỗi từ nhiều định dạng.
smci

"danh sách khổng lồ ... cơ sở dữ liệu" chỉ đơn giản ngụ ý rằng có rất nhiều trong số họ, không phải tất cả chúng đều là các định dạng khác nhau. Hoàn toàn có thể chấp nhận để viết mã đọc một định dạng duy nhất, nếu bạn biết rằng có một định dạng duy nhất trong đầu vào. Trong trường hợp này, nó sẽ sập nếu nó được thông qua một cái gì đó không đúng định dạng.
RoG

@RoG: không thể chấp nhận việc viết mã sản xuất gặp sự cố với định dạng sai / mã Unicode / bị cắt / thiếu / dữ liệu, định dạng NaNs, M / D / Y vs D / M / Y, YY vs YYYY, v.v. trường hợp ngoại lệ có thể tránh được với một giải pháp bảy lớp như tôi đã chỉ ra. Hầu hết các "cơ sở dữ liệu khổng lồ" trong thế giới thực đều như vậy. Chỉ vì OP không nói rõ ràng rằng điều đó không có nghĩa đó không phải là bối cảnh điển hình. Tôi sẽ không cãi nhau với bạn. Bạn sắp xếp bộ dữ liệu nào và tại sao bạn nghĩ những giả định đó là hợp lý? Trừ khi chúng ta chỉ nói về mã đồ chơi đòi hỏi phải can thiệp liên tục.
smci

1
Có vẻ hơi ngu ngốc khi cho rằng hoàn toàn chắc chắn rằng OP phải có dữ liệu không bao giờ có sự mâu thuẫn. Vâng, có thể có dữ liệu như vậy, nhưng không, chúng tôi không thể cho rằng đó là trường hợp ở đây. Tôi nghĩ rằng câu trả lời này là hữu ích, chắc chắn với tôi, người đang tìm kiếm câu trả lời tương tự cho một câu hỏi rất giống nhau, trong đó sự không nhất quán chắc chắn là một vấn đề.
Paul Miller

1
emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")
emp.info()

nó hiển thị Cột "Thời gian ngày bắt đầu" và cả "Thời gian đăng nhập cuối cùng" đều là "object = chuỗi" trong khung dữ liệu

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object
Start Date           1000 non-null object

Last Login Time      1000 non-null object
Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: float64(1), int64(1), object(6)
memory usage: 62.6+ KB

Bằng cách sử dụng parse_dates tùy chọn được read_csvđề cập, bạn có thể chuyển đổi chuỗi thời gian của bạn thành định dạng datetime của gấu trúc.

emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv", parse_dates=["Start Date", "Last Login Time"])
emp.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object
Start Date           1000 non-null datetime64[ns]
Last Login Time      1000 non-null datetime64[ns]
Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: datetime64[ns](2), float64(1), int64(1), object(4)
memory usage: 62.6+ KB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.