2012-08-22 28 views
5

Tôi đang xử lý một lượng lớn dữ liệu có cả giá trị và thời gian (theo chuỗi).Làm thế nào để đối phó với các giá trị thời gian hơn 24 giờ trong python?

Tôi đang chuyển đổi các giá trị thời gian chuỗi thành giá trị datetime với đoạn mã sau:

time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 

Vấn đề duy nhất là một số dữ liệu của tôi có định dạng: 24: 00: 00,004.
Vì vậy, một số dữ liệu thực sự trên 24 giờ

Python đang cho tôi lỗi này: ValueError: dữ liệu thời gian '24: 00: 00: 004' không khớp với định dạng '% H:% M:% S. % f'

Bất kỳ ý tưởng về làm thế nào để đối phó với vấn đề này

Trả lời

8

các %H tham số chỉ có thể phân tích các giá trị nằm trong khoảng 0-23. Bạn sẽ phải tự đối phó với những tem thời gian cụ thể:

try: 
    time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 
except ValueError: 
    time = time.replace(' 24', ' 23') 
    time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 
    time += datetime.timedelta(hours=1) 
+0

Thật may là có một khoảng trống trước giờ để cho phép sử dụng 'thay thế' thay vì một số giải pháp xấu xí hơn bằng cách sử dụng' re'. – mgilson

+2

@mgilson: trong trường hợp này tôi đã sử dụng ''23' + time [2:]' thay vào đó, có lẽ kết hợp với 'time.startswith ('24')'. –

+1

'.placeplace()' cũng có tham số 'count'. Tôi thường sử dụng nó để tránh thay thế ngẫu nhiên phụ. Đối với trường hợp không gian, điều đó cũng có thể đã hoạt động. – DSM

2

Hãy thử phân tích những giờ riêng:

hours, rest = time.split(':', 1) 
time = datetime.timedelta(hours=int(hours)) + datetime.datetime.strptime(rest, "%M:%S.%f") 
+0

@ J.F.Sebastian cảm ơn, đã khắc phục. – ecatmur

1

Có vẻ như dữ liệu của bạn không chứa ngày tháng, nhưng nhịp thời gian, vì vậy bạn nên có lẽ lưu trữ dữ liệu của bạn dưới dạng timedelta thay vì datetime.


Bạn có thể sử dụng this chức năng để tạo ra một timedelta từ chuỗi của bạn:

import re 
from datetime import timedelta 

def parseTimeDelta(s): 
    d = re.match(
      r'((?P<days>\d+) days,)?(?P<hours>\d+):' 
      r'(?P<minutes>\d+):(?P<seconds>\d+)\.(?P<milliseconds>\d+)', 
      str(s)).groupdict(0) 
    return timedelta(**dict(((key, int(value)) 
           for key, value in d.items()))) 

Phân tích chuỗi thời gian của bạn '24:00:00.004' như thế này

>>>t = parseTimeDelta('24:00:00.04')

sẽ cho kết quả trong một timedelta đại diện như thế này

>>> print t
1 day, 0:00:00.004000

+0

'% f' khớp với micro giây, không phải là mili giây. Đừng gọi 'str()' không cần thiết. – jfs

Các vấn đề liên quan