11 Stimmen

12-Stunden-Datum/Uhrzeit in 24-Stunden-Datum/Uhrzeit umrechnen

Ich habe eine tabulatorgetrennte Datei, in der jeder Datensatz ein Zeitstempelfeld im 12-Stunden-Format hat:

mm/dd/yyyy hh:mm:ss [AM|PM].

Ich muss diese Felder schnell in die 24-Stunden-Zeit umwandeln:

mm/dd/yyyy HH:mm:ss.

Wie lässt sich das am besten bewerkstelligen? Ich arbeite auf einer Windows-Plattform, habe aber zusätzlich zu den üblichen Windows-Tools Zugriff auf sed, awk, perl, python und tcl.

12voto

Jonathan Leffler Punkte 694013

Verwendung von Perl und handgefertigten Regexen anstelle von Einrichtungen wie strptime:

#!/bin/perl -w
while (<>)
{
    # for date times that don't use leading zeroes, use this regex instead:
    # (?:\d{1,2}/\d{1,2}/\d{4} )(\d{1,2})(?::\d\d:\d\d) (AM|PM)
    while (m%(?:\d\d/\d\d/\d{4} )(\d\d)(?::\d\d:\d\d) (AM|PM)%)
    {
        my $hh = $1;
        $hh -= 12 if ($2 eq 'AM' && $hh == 12);
        $hh += 12 if ($2 eq 'PM' && $hh != 12);
        $hh = sprintf "%02d", $hh;
        # for date times that don't use leading zeroes, use this regex instead:
        # (\d{1,2}/\d{1,2}/\d{4} )(\d{1,2})(:\d\d:\d\d) (?:AM|PM)
        s%(\d\d/\d\d/\d{4} )(\d\d)(:\d\d:\d\d) (?:AM|PM)%$1$hh$3%;
    }
    print;
}

Das ist sehr umständlich - konvertiert aber auch möglicherweise mehrere Zeitstempel pro Zeile.

Beachten Sie, dass die Umwandlung von AM/PM in 24-Stunden nicht trivial ist.

  • 12:01 UHR --> 00:01 UHR
  • 12:01 UHR --> 12:01 UHR
  • 01:30 UHR --> 01:30 UHR
  • 13:30 UHR --> 13:30 UHR

Jetzt getestet:

perl ampm-24hr.pl <<!
12/24/2005 12:01:00 AM
09/22/1999 12:00:00 PM
12/12/2005 01:15:00 PM
01/01/2009 01:56:45 AM
12/30/2009 10:00:00 PM
12/30/2009 10:00:00 AM
!

12/24/2005 00:01:00
09/22/1999 12:00:00
12/12/2005 13:15:00
01/01/2009 01:56:45
12/30/2009 22:00:00
12/30/2009 10:00:00

Hinzugefügt :

Sur Was ist ein einfacher Weg, um zwischen einer AM/PM-Zeit und einer 24-Stunden-Zeit in JavaScript zu konvertieren? wird ein alternativer Algorithmus für die Umwandlung bereitgestellt:

$hh = ($1 % 12) + (($2 eq 'AM') ? 0 : 12);

Nur ein Test... wahrscheinlich sauberer.

12voto

Biswanath Punkte 121

Es ist eine 1-zeilige Sache in Python:

time.strftime('%H:%M:%S', time.strptime(x, '%I:%M %p'))

Beispiel:

>>> time.strftime('%H:%M:%S', time.strptime('08:01 AM', '%I:%M %p'))
'08:01:00'
>>> time.strftime('%H:%M:%S', time.strptime('12:01 AM', '%I:%M %p'))
'00:01:00'

4voto

Martin Thurau Punkte 7368

Verwenden Sie Pythons datetime Modul irgendwie wie folgt:

import datetime

infile = open('input.txt')
outfile = open('output.txt', 'w')
for line in infile.readlines():
  d = datetime.strptime(line, "input format string")
  outfile.write(d.strftime("output format string")

Ungetesteter Code ohne Fehlerprüfung. Außerdem wird die gesamte Eingabedatei vor dem Start in den Speicher eingelesen. (Ich weiß, es gibt viel Raum für Verbesserungen wie mit Anweisung ... Ich mache dies ein Community-Wiki-Eintrag, wenn jemand etwas hinzufügen möchte)

2voto

Erik Punkte 693

Um nur das Stundenfeld zu konvertieren, in Python:

def to12(hour24):
    return (hour24 % 12) if (hour24 % 12) > 0 else 12

def IsPM(hour24):
    return hour24 > 11

def to24(hour12, isPm):
    return (hour12 % 12) + (12 if isPm else 0)

def IsPmString(pm):
    return "PM" if pm else "AM"

def TestTo12():    
    for x in range(24):
        print x, to12(x), IsPmString(IsPM(x))

def TestTo24():
    for pm in [False, True]:
        print 12, IsPmString(pm), to24(12, pm)
        for x in range(1, 12):
            print x, IsPmString(pm), to24(x, pm)

0voto

Vielleicht ist das zu einfach gedacht, aber warum importieren Sie die Daten nicht in Excel, markieren die gesamte Spalte und ändern das Datumsformat, und exportieren sie dann als Tabulator-getrennte Datei wieder? (Ich habe das nicht getestet, aber es klingt irgendwie logisch für mich :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X