Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Θέλω να κάνω κάτι σαν το παρακατω με μια διαφορα

>>> from datetime import datetime
>>> dt_str = '9/24/2010 5:03:29'
>>> dt_obj = datetime.strptime(dt_str, '%m/%d/%Y %I:%M:%S')
>>> dt_obj
datetime.datetime(2010, 9, 24, 17, 3, 29)

Υπαρχει καποιος τροπος αν δεν δλινονται τα λεπτα και τα δευτερολεπτα να γινονται initialize στο 00?

Δημοσ.

Η default τιμή τους μηδέν είναι αλλά θα πρέπει να δώσεις το σωστό argument στην strptime()

>>> from datetime import datetime
>>> dt_str = '9/24/2010 5'
>>> dt_obj = datetime.strptime(dt_str, '%m/%d/%Y %I')
>>> dt_obj
datetime.datetime(2010, 9, 24, 5, 0)
>>> dt_obj.strftime('%m/%d/%Y %I:%M:%S')
'09/24/2010 05:00:00'

Αν τα format στα οποία παίρνεις τα dt_str είναι μόνο δύο μπορείς να το κάνεις έτσι (στο try θα βάλεις το format που εμφανίζεται συχνότερα)

try:
    dt_obj = datetime.strptime(dt_str, '%m/%d/%Y %I:%M:%S')
except ValueError:
    dt_obj = datetime.strptime(dt_str, '%m/%d/%Y %I')

Αν είναι περισσότερα τα formats, τότε μπορείς να επεκτείνεις την προηγούμενη λύση ως εξής:

formats = ('%m/%d/%Y %I', '%m/%d/%Y %I:%M:%S',)
for fmt in formats:
    try:
        dt_obj = datetime.strptime(dt_str, fmt)
    except ValueError:
        pass
    else:
        break
else:
    raise ValueError("time data '%s' does not match any known format: %r" % (dt_str, formats))

Η λύση αυτή είναι καλύτερη ακόμα και όταν έχεις μόνο 2 expected formats γιατί θα σου δωσει σωστό exception αν λάβεις malformed input.

 

Αν είναι πολλά τα expected formats (πχ 5+), σε απασχολεί το performance και το input σου είναι μοιρασμένο μεταξύ των διαφόρων formats, τότε θα είναι μάλλον καλύτερο να κάνεις με κάποιο τρόπο parse το dt_str, γιατί τα exceptions είναι σχετικά ακριβά (αλλά κάντο profile για να είσαι σίγουρος ότι αξίζει τον κόπο):

formats = {
    1: '%m/%d/%Y %I',
    2: '%m/%d/%Y %I:%M',
    3: '%m/%d/%Y %I:%M:%S',
}

no_of_semicolons = len(dt_str.split(":"))

try:
    dt_obj = datetime.strptime(dt_str, formats[no_of_semicolons])
except (ValueError, KeyError):
    raise ValueError("time data '%s' does not match any known format: %r" % (dt_str, formats.values()))

Αν τα βαριέσαι όλα αυτά και δεν σε πειράζει να χρησιμοποιήσεις κάποιο third party library μπορείς να χρησιμοποιήσεις το dateutil.parser.parse(), δίνοντας του fuzzy=True

http://labix.org/python-dateutil#head-c0e81a473b647dfa787dc11e8c69557ec2c3ecd2

  • Like 1
Δημοσ. (επεξεργασμένο)

Eυχαριστω πολυ, το ειχα διαβασει το datetime module απλα μου ειχε ξεφυγει strptime και το strftime.

 

Μία ερώτηση μόνο:

date = datetime.datetime.strptime(time, "%Y/%m/%d-%H:%M:%S")

To dash πετάει error λόγω αρνητικής τιμής, μπορώ κάπως να το αποφύγω?

Επεξ/σία από Anubis13

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...