Phân tích cú pháp chuỗi ngày và thay đổi định dạng


115

Tôi có một chuỗi ngày có định dạng 'Thứ Hai ngày 15 tháng 2 năm 2010'. Tôi muốn thay đổi định dạng thành '15 / 02/2010 '. Tôi có thể làm cái này như thế nào?


Bản sao của tất cả những thứ này: stackoverflow.com/search?q=%5Bpython%5D+parse+date . Bản sao chính xác của thise: stackoverflow.com/questions/1713594/…
S.Lott

Câu trả lời:


153

datetime mô-đun có thể giúp bạn điều đó:

datetime.datetime.strptime(date_string, format1).strftime(format2)

Đối với ví dụ cụ thể bạn có thể làm

>>> datetime.datetime.strptime('Mon Feb 15 2010', '%a %b %d %Y').strftime('%d/%m/%Y')
'15/02/2010'
>>>

2
datetime.datetime (Thứ Hai ngày 15 tháng 2 năm 2010, "% a% b% d% Y"). strftime ("% d /% m /% Y") Có đúng không? nhưng tôi có một lỗi.
Nimmy

1
@nimmyliji: nó đã được sửa 10 phút trước khi bạn đăng nhận xét của mình. và tất nhiên bạn nên có date_stringdưới dạng một chuỗi.
SilentGhost

3
xin vui lòng cho một ví dụ hoạt động đầy đủ;) nhập / ... nào là cần thiết?
viết mã

format1cần phải là một chuỗi để thể hiện định dạng của chuỗi ngày đầu vào. format2là định dạng chuỗi đích để xuất.
ThorSummoner

1
Bạn có thể nói rõ hơn, format1 nên trông như thế nào trong ví dụ này?
dùng1767754

59

Bạn có thể cài đặt thư viện dateutil . parseHàm của nó có thể tìm ra định dạng chuỗi mà không cần phải chỉ định định dạng như bạn làm với datetime.strptime.

from dateutil.parser import parse
dt = parse('Mon Feb 15 2010')
print(dt)
# datetime.datetime(2010, 2, 15, 0, 0)
print(dt.strftime('%d/%m/%Y'))
# 15/02/2010

dateutil.parse là một lựa chọn thay thế tốt hơn nếu định dạng chính xác của chuỗi ISO hợp pháp là không xác định. ISO có thể có hoặc không chứa micro giây. Nó có thể có hoặc không chứa chữ "Z" ở cuối. datetime.strptime không đủ linh hoạt để đáp ứng nhu cầu đó.
Michael Kariv 12/1213

4
Pase Date nên được sử dụng cẩn thận. parse ('12 .07.2017 ') trả về datetime (2017, 12, 7, ..) nhưng parse ('13 .07.2017') trả về .datetime (2017, 7, 13, ...)
ego2dot0

Trong python 3.xnhu cầu để cài đặtpython-dateutil pip install python-dateutil
AB Abhi

24
>>> from_date="Mon Feb 15 2010"
>>> import time                
>>> conv=time.strptime(from_date,"%a %b %d %Y")
>>> time.strftime("%d/%m/%Y",conv)
'15/02/2010'

23

chuyển đổi chuỗi thành đối tượng datetime

from datetime import datetime
s = "2016-03-26T09:25:55.000Z"
f = "%Y-%m-%dT%H:%M:%S.%fZ"
out = datetime.strptime(s, f)
print(out)
output:
2016-03-26 09:25:55

Đây không phải là định dạng mà anh ta yêu cầu, mà có một chuỗi tháng "Tháng hai" trong đó.
Shahir Ansari

@ShahirAnsari bạn có thể thay đổi định dạng theo ý muốn tham khảo " docs.python.org/3/library/datetime.html "
anjaneyulubatta505

14

Vì câu hỏi này thường xuất hiện, đây là lời giải thích đơn giản.

datetimehoặc timemô-đun có hai chức năng quan trọng.

  • strftime - tạo một biểu diễn chuỗi ngày hoặc giờ từ một đối tượng datetime hoặc time.
  • strptime - tạo một đối tượng datetime hoặc time từ một chuỗi.

Trong cả hai trường hợp, chúng ta cần một chuỗi định dạng. Nó là phần biểu diễn cho biết ngày hoặc giờ được định dạng như thế nào trong chuỗi của bạn.

Bây giờ giả sử chúng ta có một đối tượng ngày tháng.

>>> from datetime import datetime
>>> d = datetime(2010, 2, 15)
>>> d
datetime.datetime(2010, 2, 15, 0, 0)

Nếu chúng ta muốn tạo một chuỗi từ ngày này ở định dạng 'Mon Feb 15 2010'

>>> s = d.strftime('%a %b %d %y')
>>> print s
Mon Feb 15 10

Giả sử chúng ta muốn chuyển đổi nó smột lần nữa thành một datetimeđối tượng.

>>> new_date = datetime.strptime(s, '%a %b %d %y')
>>> print new_date
2010-02-15 00:00:00

Tham khảo Tài liệu này tất cả các chỉ thị định dạng liên quan đến ngày giờ.


Tôi thích lời giải thích của bạn.
mê mẩn

2

Chỉ nhằm mục đích hoàn thành: khi phân tích cú pháp một ngày bằng cách sử dụng strptime()và ngày chứa tên của ngày, tháng, v.v., hãy lưu ý rằng bạn phải tính đến ngôn ngữ.

Nó cũng được đề cập như một chú thích trong tài liệu .

Ví dụ:

import locale
print(locale.getlocale())

>> ('nl_BE', 'ISO8859-1')

from datetime import datetime
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> ValueError: time data '6-Mar-2016' does not match format '%d-%b-%Y'

locale.setlocale(locale.LC_ALL, 'en_US')
datetime.strptime('6-Mar-2016', '%d-%b-%Y').strftime('%Y-%m-%d')

>> '2016-03-06'

2

@codeling và @ user1767754: Hai dòng sau sẽ hoạt động. Tôi không thấy ai đăng giải pháp hoàn chỉnh cho vấn đề ví dụ đã được hỏi. Hy vọng rằng điều này là đủ giải thích.

import datetime

x = datetime.datetime.strptime("Mon Feb 15 2010", "%a %b %d %Y").strftime("%d/%m/%Y")
print(x)

Đầu ra:

15/02/2010

1

Bạn cũng có thể đạt được điều này bằng cách sử dụng gấu trúc:

import pandas as pd

pd.to_datetime('Mon Feb 15 2010', format='%a %b %d %Y').strftime('%d/%m/%Y')

Đầu ra:

'15/02/2010'

Bạn có thể áp dụng phương pháp tiếp cận gấu trúc cho các kiểu dữ liệu khác nhau như:

import pandas as pd
import numpy as np

def reformat_date(date_string, old_format, new_format):
    return pd.to_datetime(date_string, format=old_format, errors='ignore').strftime(new_format)

date_string = 'Mon Feb 15 2010'
date_list = ['Mon Feb 15 2010', 'Wed Feb 17 2010']
date_array = np.array(date_list)
date_series = pd.Series(date_list)

old_format = '%a %b %d %Y'
new_format = '%d/%m/%Y'

print(reformat_date(date_string, old_format, new_format))
print(reformat_date(date_list, old_format, new_format).values)
print(reformat_date(date_array, old_format, new_format).values)
print(date_series.apply(lambda x: reformat_date(x, old_format, new_format)).values)

Đầu ra:

15/02/2010
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']
['15/02/2010' '17/02/2010']

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.