Εισαγωγή
Τα δεδομένα μπορούν να αναπαρασταθούν με διάφορες μορφές – και είναι ένας βολικός τρόπος αναπαράστασης ημερομηνιών και ωρών χορδές. Ωστόσο, για να εργαστούμε με αυτές τις ημερομηνίες και ώρες με αριθμητικό τρόπο (όπως υπολογισμός διαφορών ώρας, προσθήκη ή αφαίρεση ώρας κ.λπ.) – πρέπει να τις μετατρέψουμε σε datetime
αντικείμενο.
Μία από τις πιο κοινές πηγές του ημερομηνίες με μορφή συμβολοσειράς είναι REST API που επιστρέφουν αγνωστικές συμβολοσειρές, τις οποίες μπορούμε στη συνέχεια να μετατρέψουμε σε άλλες μορφές.
Επιπλέον – οι ζώνες ώρας είναι ένας κοινός πονοκέφαλος όταν πρόκειται για την εργασία με αντικείμενα ημερομηνίας ώρας, επομένως θα πρέπει να το σκεφτούμε και κατά τη μετατροπή.
Σε αυτόν τον οδηγό – θα ρίξουμε μια ματιά στον τρόπο μετατροπής μιας ημερομηνίας/ώρας συμβολοσειράς σε α
datetime
αντικείμενο στην Python, χρησιμοποιώντας το ενσωματωμένοdatetime
module, αλλά και modules τρίτων όπως π.χdateutil
,arrow
και Μάγια, λογιστικές ζώνες ώρας.
Μετατροπή συμβολοσειρών με χρήση ημερομηνίας ώρας
Η ημερομηνία Η ενότητα αποτελείται από τρεις διαφορετικούς τύπους αντικειμένων: date
, time
, να datetime
. ο date
το αντικείμενο περιέχει την ημερομηνία, time
κρατάει το χρόνο, και datetime
κρατάει και ημερομηνία και ώρα!
import datetime
print(f'Current date/time: {datetime.datetime.now()}')
Η εκτέλεση αυτού του κώδικα θα είχε ως αποτέλεσμα:
Current date/time: 2022-12-01 10:27:03.929149
Όταν δεν δίνεται προσαρμοσμένη μορφοποίηση, χρησιμοποιείται η προεπιλεγμένη μορφή συμβολοσειράς, δηλαδή η μορφή για "2022-12-01 10:27:03.929149" είναι σε ISO 8601 μορφή (ΕΕΕΕ-ΜΜ-ΗΗΗΩΩ:ΜΜ:ΔΣ.μμμμμ). Εάν η συμβολοσειρά εισόδου μας για να δημιουργήσουμε ένα datetime
Το αντικείμενο είναι στην ίδια μορφή ISO 8601 ή εάν γνωρίζετε τη μορφή που θα λάβετε εκ των προτέρων, μπορούμε εύκολα να το αναλύσουμε σε datetime
αντικείμενο:
import datetime
date_time_str = '2022-12-01 10:27:03.929149'
date_time_obj = datetime.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f')
print('Date:', date_time_obj.date())
print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)
Με την εκτέλεση του θα εκτυπωθούν η ημερομηνία, η ώρα και η ημερομηνία-ώρα:
Date: 2022-12-01
Time: 10:27:03.929149
Date-time: 2022-12-01 10:27:03.929149
Εδώ, χρησιμοποιούμε το strptime()
μέθοδος, η οποία δέχεται δύο ορίσματα:
- Η ημερομηνία με μορφοποίηση συμβολοσειράς
- Η μορφή του πρώτου επιχειρήματος
Ο καθορισμός της μορφής όπως αυτή κάνει την ανάλυση πολύ πιο γρήγορη από τότε datetime
δεν χρειάζεται να προσπαθήσει να ερμηνεύσει τη μορφή από μόνη της, η οποία είναι πολύ πιο ακριβή υπολογιστικά. Η τιμή επιστροφής είναι του τύπου datetime
.
Στο παράδειγμά μας, "2022-12-01 10:27:03.929149"
είναι η συμβολοσειρά εισόδου και "%Y-%m-%d %H:%M:%S.%f"
είναι η μορφή της συμβολοσειράς ημερομηνίας μας. Το επιστρεφόμενο datetime
Η τιμή αποθηκεύεται ως date_time_obj
.
Δεδομένου ότι αυτό είναι α datetime
αντικείμενο, μπορούμε να ονομάσουμε το date()
και time()
μεθόδους απευθείας σε αυτό. Όπως μπορείτε να δείτε από την έξοδο, εκτυπώνει το τμήμα «ημερομηνία» και «ώρα» της συμβολοσειράς εισόδου!
Μορφοποίηση διακριτικών
Αξίζει να αφιερώσετε λίγο χρόνο για να καταλάβετε μορφοποιήστε διακριτικά - ο "%Y-%m-%d %H:%M:%S.%f"
από πριν.
Κάθε διακριτικό αντιπροσωπεύει ένα διαφορετικό μέρος της ημερομηνίας-ώρας, όπως ημέρα, μήνα, έτος, ημέρα του μήνα ή της εβδομάδας, κ.λπ. λίστα υποστηριζόμενων διακριτικών είναι αρκετά εκτεταμένο ώστε να επιτρέπει διάφορες μορφοποιήσεις. Μερικά από τα πιο συχνά χρησιμοποιούμενα, που έχουμε χρησιμοποιήσει επίσης νωρίτερα είναι:
%Y
: Έτος (4 ψηφία)%m
: Μήνας%d
: Ημέρα του μήνα%H
: Ώρα (24 ώρες)%M
: Λεπτά%S
: Δευτερόλεπτα%f
: Μικροδευτερόλεπτα
Σημείωση: Όλα αυτά τα διακριτικά, εκτός από το έτος, αναμένεται να έχουν μηδενική επένδυση (δηλ. ο Αύγουστος είναι ο 8ος μήνας και έχει μηδενική επένδυση σε 08
).
Χρήση διακριτικών μορφοποίησης strptime() για μετατροπή συμβολοσειράς σε διαφορετική μορφή ώρας ημερομηνίας
Εάν η μορφή μιας συμβολοσειράς είναι γνωστή, μπορεί εύκολα να αναλυθεί σε a datetime
αντικείμενο χρησιμοποιώντας strptime()
. Ας ρίξουμε μια ματιά σε ένα μη τετριμμένο παράδειγμα που μεταφράζεται από τη μια μορφή στην άλλη:
import datetime
date_time_str = 'Jul 17 2022 9:20AM'
date_time_obj = datetime.datetime.strptime(date_time_str, '%b %d %Y %I:%M%p')
print('Date:', date_time_obj.date())
print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)
Η συμβολοσειρά εισόδου ήταν μιας μορφής - "17 Ιουλίου 2022 9:20 π.μ.". Γνωρίζοντας αυτή τη μορφή, αντιστοιχίσαμε τα συστατικά στοιχεία στη μορφή ISO 8601 και τη μετατρέψαμε σε datetime
αντικείμενο:
Date: 2022-07-17
Time: 09:20:00
Date-time: 2022-07-17 09:20:00
Ακολουθεί μια σύντομη λίστα κοινών ωρών ημερομηνίας με μορφοποίηση συμβολοσειρών και των αντίστοιχων μορφών τους strptime()
:
"Jun 28 2018 at 7:40AM" -> "%b %d %Y at %I:%M%p"
"September 18, 2017, 22:19:55" -> "%B %d, %Y, %H:%M:%S"
"Sun,05/12/99,12:30PM" -> "%a,%d/%m/%y,%I:%M%p"
"Mon, 21 March, 2015" -> "%a, %d %B, %Y"
"2018-03-12T10:12:45Z" -> "%Y-%m-%dT%H:%M:%SZ"
Μπορείτε να αναλύσετε μια συμβολοσειρά ημερομηνίας-ώρας οποιασδήποτε μορφής – αρκεί να χρησιμοποιείτε τη σωστή συμβολοσειρά διακριτικών μορφής για την είσοδο που λαμβάνετε.
Μετατροπή συμβολοσειράς σε ώρα ημερομηνίας με τις ζώνες ώρας
Ο χειρισμός των ημερομηνιών-ωρών γίνεται πιο περίπλοκος όταν ασχολείται με τις ζώνες ώρας. Όλα τα παραπάνω παραδείγματα μέχρι στιγμής είναι αφελή ως προς τη ζώνη ώρας. Αυτά είναι γνωστά ως αφελή αντικείμενα ημερομηνίας.
Ωστόσο, η datetime
τα αντικείμενα περιέχουν ένα πεδίο ακριβώς για την αποθήκευση δεδομένων που σχετίζονται με τη ζώνη ώρας – tzinfo
:
import datetime as dt
dtime = dt.datetime.now()
print(dtime)
print(dtime.tzinfo)
Η tzinfo
πεδίο προορίζεται να είναι α datetime.timezone
αντικείμενο, που δηλώνει τις πληροφορίες της ζώνης ώρας. Του None
από προεπιλογή, και υποδηλώνει ότι το αντικείμενο ημερομηνίας ώρας είναι απλό στη ζώνη ώρας. Μια πολύ κοινή εξωτερική βιβλιοθήκη για το χειρισμό των ζωνών ώρας είναι pytz
. Μπορείτε να ορίσετε PyTz αντικείμενα όπως το tzinfo
πεδίο επίσης.
Εάν δεν το έχετε ήδη - εγκαταστήστε το μέσω:
$ pip install pytz
Χρησιμοποιώντας το PyTz, μπορούμε να δημιουργήσουμε μια άγκυρα για ώρες ημερομηνίας με επίγνωση της ζώνης ώρας, όπως το UTC:
import datetime as dt
import pytz
dtime = dt.datetime.now(pytz.utc)
print(dtime)
print(dtime.tzinfo)
Παραγωγή:
2022-12-01 02:07:41.960920+00:00
UTC
Δεν είναι πλέον 11 π.μ., αλλά 2 π.μ., γιατί έχουμε ορίσει τη ζώνη ώρας λίγες ώρες πριν! Αυτό αλλάζει τη ζώνη ώρας της ημερομηνίας ώρας.
+00:00
είναι η διαφορά μεταξύ της εμφανιζόμενης ώρας και της ώρας UTC ως παγκόσμιας άγκυρας συντονισμού. Έχουμε ορίσει την ώρα να είναι σε UTC, οπότε η μετατόπιση είναι 00:00
. Αυτό είναι ένα αντικείμενο με επίγνωση ζώνης ώρας.
Ομοίως, μπορούμε να αλλάξουμε την ερμηνεία της ίδιας ημερομηνίας ώρας μεταξύ των ζωνών ώρας. Ας μετατρέψουμε μια συμβολοσειρά, όπως "2022-06-29 17:08:00" σε ώρα ημερομηνίας και στη συνέχεια περιορίζω στη ζώνη ώρας "America/New_York":
import datetime as dt
import pytz
date_time_str = '2022-06-29 17:08:00'
date_time_obj = dt.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S')
timezone = pytz.timezone('America/New_York')
timezone_date_time_obj = timezone.localize(date_time_obj)
print(timezone_date_time_obj)
print(timezone_date_time_obj.tzinfo)
Σημείωση: Τοπική Προσαρμογή μετατρέπει μια απλή ημερομηνία ημερομηνίας ζώνης ώρας σε ώρα ημερομηνίας με επίγνωση της ζώνης ώρας και αντιμετωπίζει τη ζώνη ώρας ως τοπική. Έτσι, το Η ημερομηνία ημερομηνίας παραμένει η ίδια, αλλά δεδομένης της διαφορετικής ζώνης ώρας, δεν αντιπροσωπεύει πλέον το ίδιο χρονικό σημείο χωρίς περιορισμούς από τις ζώνες ώρας.
Παίρνουμε το ίδιο τιμή ημερομηνίας, αντισταθμίζεται από -04: 00 σε σύγκριση με την ώρα UTC:
2022-06-29 17:08:00-04:00
America/New_York
17:08 στο Τόκιο δεν είναι την ίδια χρονική στιγμή με τις 17:08 στη Νέα Υόρκη. 17:08 στο Τόκιο είναι 3:08 στη Νέα Υόρκη.
Πώς να βρείτε όλους τους κωδικούς/ψευδώνυμα ζώνης ώρας;
Για να βρείτε όλες τις διαθέσιμες ζώνες ώρας, επιθεωρήστε το all_timezones
πεδίο, το οποίο είναι μια λίστα με όλες τις διαθέσιμες ζώνες ώρας:
print(f'There are {len(pytz.all_timezones)} timezones in PyTzn')
for time_zone in pytz.all_timezones:
print(time_zone)
Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!
There are 594 timezones in PyTz
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
...
Αλλάξτε τη ζώνη ώρας της ημερομηνίας
Μπορούμε να μετατρέψουμε τη ζώνη ώρας σε μια ζώνη ώρας με επίγνωση datetime
αντικείμενο από τη μια περιοχή στην άλλη, αντί να εντοπίζεται μια απλή ημερομηνία-ώρα μέσω του φακού κάποιας ζώνης ώρας.
Αυτό είναι διαφορετικό από τον εντοπισμό, καθώς η τοπική προσαρμογή αντιπροσωπεύει ένα διαφορετικό χρονικό σημείο, αλλά η μετατροπή της ζώνης ώρας ενός αντικειμένου αντιπροσωπεύει το ίδιο χρονικό σημείο, μέσω διαφορετικού φακού:
import datetime as dt
import pytz
timezone_nw = pytz.timezone('America/New_York')
nw_datetime_obj = dt.datetime.now(timezone_nw)
timezone_london = pytz.timezone('Europe/London')
london_datetime_obj = nw_datetime_obj.astimezone(timezone_london)
print('America/New_York:', nw_datetime_obj)
print('Europe/London:', london_datetime_obj)
Αρχικά, δημιουργήσαμε ένα αντικείμενο ημερομηνίας ώρας με την τρέχουσα ώρα και το ορίσαμε ως ζώνη ώρας "America/New_York". Στη συνέχεια χρησιμοποιώντας το astimezone()
μέθοδο, το έχουμε μετατρέψει datetime
στη ζώνη ώρας «Ευρώπη/Λονδίνο». Και τα δυο datetime
Το s θα εκτυπώσει διαφορετικές τιμές, χρησιμοποιώντας τη μετατόπιση UTC ως σύνδεσμο αναφοράς μεταξύ τους:
America/New_York: 2022-11-30 21:24:30.123400-05:00
Europe/London: 2022-12-01 02:24:30.123400+00:00
2:24 την επόμενη μέρα στο Λονδίνο is την ίδια χρονική στιγμή με τις 21:24 της προηγούμενης ημέρας στη Νέα Υόρκη καθώς το Λονδίνο είναι 5 ώρες μπροστά.
Όπως ήταν αναμενόμενο, οι ημερομηνίες-ώρες είναι διαφορετικές, καθώς απέχουν περίπου 5 ώρες μεταξύ τους.
Μετατροπή συμβολοσειράς σε ώρα ημερομηνίας χρησιμοποιώντας βιβλιοθήκες τρίτων
Πύθωνα datetime
Η μονάδα μπορεί να μετατρέψει όλους τους διαφορετικούς τύπους συμβολοσειρών σε α datetime
αντικείμενο. Αλλά το κύριο πρόβλημα είναι ότι για να γίνει αυτό πρέπει να δημιουργήσετε την κατάλληλη συμβολοσειρά κώδικα μορφοποίησης που strptime()
μπορεί να καταλάβει. Η δημιουργία αυτής της συμβολοσειράς απαιτεί χρόνο και κάνει τον κώδικα δυσκολότερο στην ανάγνωση.
Αντίθετα, μπορούμε να χρησιμοποιήσουμε άλλες βιβλιοθήκες τρίτων για να το κάνουμε πιο εύκολο.
Σε ορισμένες περιπτώσεις, αυτές οι βιβλιοθήκες τρίτων έχουν επίσης καλύτερη ενσωματωμένη υποστήριξη για τον χειρισμό και τη σύγκριση ημερομηνιών-ωρών, ενώ ορισμένες έχουν ακόμη και ενσωματωμένες ζώνες ώρας, επομένως δεν χρειάζεται να συμπεριλάβετε ένα επιπλέον πακέτο PyTz.
Ας ρίξουμε μια ματιά σε μερικές από αυτές τις βιβλιοθήκες στις ακόλουθες ενότητες.
Μετατρέψτε το String σε Datetime με το dateutil
Η ενότητα dateutil είναι μια επέκταση στο datetime
μονάδα μέτρησης. Ένα πλεονέκτημα είναι ότι δεν χρειάζεται να περάσουμε κανέναν κωδικό ανάλυσης για να αναλύσουμε μια συμβολοσειρά!
Για αυτόματη μετατροπή μιας συμβολοσειράς σε ημερομηνία ώρας χωρίς διακριτικό μορφής χρησιμοποιώντας Python dateutil
:
from dateutil.parser import parse
datetime = parse('2018-06-29 22:21:41')
print(datetime)
Αυτός ο διαλογισμός στα parse
η συνάρτηση θα αναλύσει τη συμβολοσειρά αυτόματα! Δεν χρειάζεται να συμπεριλάβετε καμία συμβολοσειρά μορφής. Ας προσπαθήσουμε να αναλύσουμε διαφορετικούς τύπους συμβολοσειρών χρησιμοποιώντας dateutil
:
from dateutil.parser import parse
date_array = [
'2018-06-29 08:15:27.243860',
'Jun 28 2018 7:40AM',
'Jun 28 2018 at 7:40AM',
'September 18, 2017, 22:19:55',
'Sun, 05/12/1999, 12:30PM',
'Mon, 21 March, 2015',
'2018-03-12T10:12:45Z',
'2018-06-29 17:08:00.586525+00:00',
'2018-06-29 17:08:00.586525+05:00',
'Tuesday , 6th September, 2017 at 4:30pm'
]
for date in date_array:
print('Parsing: ' + date)
dt = parse(date)
print(dt.date())
print(dt.time())
print(dt.tzinfo)
print('n')
Παραγωγή:
Parsing: 2018-06-29 08:15:27.243860
2018-06-29
08:15:27.243860
None
Parsing: Jun 28 2018 7:40AM
2018-06-28
07:40:00
None
Parsing: Jun 28 2018 at 7:40AM
2018-06-28
07:40:00
None
Parsing: September 18, 2017, 22:19:55
2017-09-18
22:19:55
None
Parsing: Sun, 05/12/1999, 12:30PM
1999-05-12
12:30:00
None
Parsing: Mon, 21 March, 2015
2015-03-21
00:00:00
None
Parsing: 2018-03-12T10:12:45Z
2018-03-12
10:12:45
tzutc()
Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29
17:08:00.586525
tzutc()
Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29
17:08:00.586525
tzoffset(None, 18000)
Parsing: Tuesday , 6th September, 2017 at 4:30pm
2017-09-06
16:30:00
None
Μπορείτε να δείτε ότι σχεδόν κάθε τύπος συμβολοσειράς μπορεί να αναλυθεί εύκολα χρησιμοποιώντας το dateutil
μονάδα μέτρησης.
Αν και αυτό είναι βολικό, θυμηθείτε από νωρίτερα ότι η πρόβλεψη της μορφής κάνει τον κώδικα πολύ πιο αργό, επομένως εάν ο κώδικας απαιτεί υψηλή απόδοση, τότε αυτή μπορεί να μην είναι η σωστή προσέγγιση για την εφαρμογή σας.
Μετατρέψτε το String σε Datetime με τη Maya
Μάγια καθιστά επίσης πολύ εύκολη την ανάλυση μιας συμβολοσειράς και την αλλαγή των ζωνών ώρας. Για να μετατρέψετε εύκολα μια συμβολοσειρά με τη Maya της Python:
import maya
dt = maya.parse('2018-04-29T17:45:25Z').datetime()
print(dt.date())
print(dt.time())
print(dt.tzinfo)
Παραγωγή:
2018-04-29
17:45:25
UTC
Για τη μετατροπή της ώρας σε διαφορετική ζώνη ώρας:
import maya
dt = maya.parse('2018-04-29T17:45:25Z').datetime(to_timezone='America/New_York', naive=False)
print(dt.date())
print(dt.time())
print(dt.tzinfo)
Παραγωγή:
2018-04-29
13:45:25
America/New_York
Τώρα δεν είναι εύκολο στη χρήση; Ας δοκιμάσουμε maya
με το ίδιο σύνολο χορδών που χρησιμοποιήσαμε dateutil
:
import maya
date_array = [
'2018-06-29 08:15:27.243860',
'Jun 28 2018 7:40AM',
'Jun 28 2018 at 7:40AM',
'September 18, 2017, 22:19:55',
'Sun, 05/12/1999, 12:30PM',
'Mon, 21 March, 2015',
'2018-03-12T10:12:45Z',
'2018-06-29 17:08:00.586525+00:00',
'2018-06-29 17:08:00.586525+05:00',
'Tuesday , 6th September, 2017 at 4:30pm'
]
for date in date_array:
print('Parsing: ' + date)
dt = maya.parse(date).datetime()
print(dt)
Παραγωγή:
Parsing: 2018-06-29 08:15:27.243860
2018-06-29 08:15:27.243860+00:00
Parsing: Jun 28 2018 7:40AM
2018-06-28 07:40:00+00:00
Parsing: Jun 28 2018 at 7:40AM
2018-06-28 07:40:00+00:00
Parsing: September 18, 2017, 22:19:55
2017-09-18 22:19:55+00:00
Parsing: Sun, 05/12/1999, 12:30PM
1999-05-12 12:30:00+00:00
Parsing: Mon, 21 March, 2015
2015-03-21 00:00:00+00:00
Parsing: 2018-03-12T10:12:45Z
2018-03-12 10:12:45+00:00
Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29 17:08:00.586525+00:00
Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29 12:08:00.586525+00:00
Parsing: Tuesday , 6th September, 2017 at 4:30pm
2017-09-06 16:30:00+00:00
Όπως μπορείτε να δείτε, όλες οι μορφές ημερομηνίας αναλύθηκαν με επιτυχία!
Εάν δεν παρέχουμε τις πληροφορίες της ζώνης ώρας, τότε τις μετατρέπει αυτόματα σε UTC. Επομένως, είναι σημαντικό να σημειωθεί ότι εμείς πρέπει παρέχετε το to_timezone
και naive
παραμέτρους εάν η ώρα δεν είναι σε UTC.
Μετατροπή συμβολοσειράς σε ώρα ημερομηνίας με το βέλος
βέλος είναι μια άλλη βιβλιοθήκη για την αντιμετώπιση της ημερομηνίας στην Python. Και όπως πριν με maya
, υπολογίζει επίσης αυτόματα τη μορφή ημερομηνίας. Μόλις ερμηνευτεί, επιστρέφει μια Python datetime
αντικείμενο από το arrow
αντικείμενο.
Για να μετατρέψετε εύκολα μια συμβολοσειρά σε datetime χρησιμοποιώντας Python arrow
:
import arrow
dt = arrow.get('2018-04-29T17:45:25Z')
print(dt.date())
print(dt.time())
print(dt.tzinfo)
Παραγωγή:
2018-04-29
17:45:25
tzutc()
Και εδώ είναι πώς μπορείτε να χρησιμοποιήσετε arrow
για να μετατρέψετε ζώνες ώρας χρησιμοποιώντας το to()
μέθοδος:
import arrow
dt = arrow.get('2018-04-29T17:45:25Z').to('America/New_York')
print(dt)
print(dt.date())
print(dt.time())
Παραγωγή:
2018-04-29T13:45:25-04:00
2018-04-29
13:45:25
Όπως μπορείτε να δείτε, η συμβολοσειρά ημερομηνίας-ώρας μετατρέπεται στην περιοχή "America/New_York".
Τώρα, ας χρησιμοποιήσουμε ξανά το ίδιο σύνολο συμβολοσειρών που χρησιμοποιήσαμε παραπάνω:
import arrow
date_array = [
'2018-06-29 08:15:27.243860',
'2018-03-12T10:12:45Z',
'2018-06-29 17:08:00.586525+00:00',
'2018-06-29 17:08:00.586525+05:00',
]
for date in date_array:
dt = arrow.get(date)
print('Parsing: ' + date)
print(dt)
Αυτός ο κώδικας θα αποτύχει για τις συμβολοσειρές ημερομηνίας-ώρας που έχουν σχολιαστεί, που είναι πάνω από το ήμισυ των παραδειγμάτων μας. Η έξοδος για άλλες συμβολοσειρές θα είναι:
Parsing: 2018-06-29 08:15:27.243860
2018-06-29T08:15:27.243860+00:00
Parsing: 2018-03-12T10:12:45Z
2018-03-12T10:12:45+00:00
Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29T17:08:00.586525+00:00
Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29T17:08:00.586525+05:00
Για να αναλύσετε σωστά τις συμβολοσειρές ημερομηνίας-ώρας που σχολιάζονται, θα πρέπει να περάσετε τα αντίστοιχα μορφοποιήστε διακριτικά για να δώσει στη βιβλιοθήκη ενδείξεις για το πώς να το αναλύσει.
Συμπέρασμα
Σε αυτό το άρθρο δείξαμε διαφορετικούς τρόπους ανάλυσης μιας συμβολοσειράς σε a datetime
αντικείμενο στην Python. Μπορείτε είτε να επιλέξετε την προεπιλεγμένη Python datetime
βιβλιοθήκη ή οποιαδήποτε από τις βιβλιοθήκες τρίτων που αναφέρονται σε αυτό το άρθρο, μεταξύ πολλών άλλων.
Το κύριο πρόβλημα με την προεπιλογή datetime
Το πακέτο είναι ότι πρέπει να καθορίσουμε τον κωδικό ανάλυσης με μη αυτόματο τρόπο για σχεδόν όλες τις μορφές συμβολοσειράς ημερομηνίας-ώρας. Έτσι, εάν η μορφή συμβολοσειράς σας αλλάξει στο μέλλον, πιθανότατα θα πρέπει να αλλάξετε και τον κώδικά σας. Αλλά πολλές βιβλιοθήκες τρίτων, όπως αυτές που αναφέρονται εδώ, το χειρίζονται αυτόματα.
Ένα ακόμη πρόβλημα που αντιμετωπίζουμε είναι η αντιμετώπιση των ζωνών ώρας. Ο καλύτερος τρόπος για να τα χειριστείτε είναι πάντα να αποθηκεύετε την ώρα στη βάση δεδομένων σας σε μορφή UTC και στη συνέχεια να τη μετατρέπετε στην τοπική ζώνη ώρας του χρήστη όταν χρειάζεται.
Αυτές οι βιβλιοθήκες δεν είναι μόνο καλές για την ανάλυση συμβολοσειρών, αλλά μπορούν να χρησιμοποιηθούν για πολλούς διαφορετικούς τύπους λειτουργιών που σχετίζονται με την ημερομηνία-ώρα. Θα σας συνιστούσα να διαβάσετε τα έγγραφα για να μάθετε τις λειτουργίες λεπτομερώς.