strptime не работает для формата ниже

1

Я использовал следующий формат, который читается из файла журнала. Используемый форматтер соответствует формату DateTime. не уверен, почему это все еще ошибка. - ValueError: данные времени "2018-01-01 10:00:00" "не соответствует формату"% Y-% m-% d% H:% M:% S '

f = open("log.txt", 'w')
f.write("UID, SID, LogTime\n")
f.write("1, 1, '2018-01-01 10:00:00'\n")
f.write("1, 1, '2018-01-01 10:30:00'\n")
f.write("1, 1, '2018-01-01 11:30:00'\n")
f.close()
x = open("log.txt", 'r')

print (x.read())
x.close()

import numpy as np 
from datetime import datetime
a = open("log.txt", 'r+')
temp = None
header = a.readline()
for line in a:
    line = line.strip()
    columns = line.split(',')
    print (columns)
    UID = columns[0]
    SID = columns[1]
    print (columns[2])
    LogTime = datetime.strptime(columns[2],"%Y-%m-%d %H:%M:%S")
    a.write(','+LogTime-temp)
    temp = LogTime
Теги:
strptime

3 ответа

3

Проблема в том, что в вашем формате есть цитаты вокруг времени, а также ведущее пространство:

f.write("1, 1, '2018-01-01 10:00:00'\n")

Но ваш синтаксический анализатор не снимает эти кавычки и пространство, и ваш strptime не ожидает их. И, в то время как 2018-01-01 10:00:00 будет соответствовать вашему формату, '2018-01-01 10:00:00' - нет.

Вы можете решить это несколькими способами:

  • Используйте модуль csv для чтения (или numpy, поскольку вы уже импортируете его), который автоматически обрабатывает цитаты и пробелы CSV.
  • Делайте обработку цитаты вручную - например, timestamp = columns[2].strip().strip("'").
  • Добавьте пробел и кавычки в формат strptime: datetime.strptime(columns[2]," '%Y-%m-%d %H:%M:%S'")

Первый кажется, безусловно, самым чистым, но все они будут работать.


Конечно, как только вы это исправите, у вас a.write(','+LogTime-temp) другая проблема: a.write(','+LogTime-temp) пытается добавить строку ',' к объекту datetime, а затем вычесть None из результата. Ни один из этих типов не совместим, поэтому это не имеет смысла.

Если вы пытались разделить последующие времена, то вам нужно:

  • Обрабатывайте первую строку специально, так как она не имеет предыдущего времени;
  • Ручка не первый дифференциал специально тоже, так как это не имеет предшествующего ,;
  • Вычтите время, чтобы получить timedelta прежде чем пытаться присоединить одну из них к строке;
  • Либо преобразуйте diff в строку с помощью str а просто добавьте ее в ',' или, может быть, лучше, используйте f-строку (или format) вместо добавления строк.

Этого должно быть достаточно, чтобы вы начали, но это не полная программа:

temp = None
for line in a:
    # ... up to LogTime = ...
    if temp is not None:
        diff = LogTime - temp
        print(diff)
    temp = LogTime

И затем вы пытаетесь записать файл в то же самое время, когда вы его читаете, и это просто ужасно. Вы прочтете одну строку, а затем перепишите следующую строку - или, более вероятно, половину следующей строки, или следующие две и третьи строки или что-то еще, затем прочитайте следующую строку после этого... То, что вы хотите сделать, - это один из:

  • Напишите в другой файл (вы можете os.replace его по оригиналу, когда вы закончите, если необходимо);
  • Просто создайте строки, которые хотите записать в список, затем close файл, open тот же файл и запишите список строк.
  • 0
    Это странно, я попробовал ручной метод, и он не удаляет первый ('), поэтому новая строка похожа на' 2018-01-01: 10: 00: 00
  • 0
    Я хочу вычислить текущую разницу временных меток и добавить в тот же файл, для первой записи нет временной метки для сравнения. но во второй строке будет добавлено «1800» как разница во времени между вторыми рядами и временными метками первого ряда.
Показать ещё 3 комментария
0

Вы читаете это значение "2018-01-01 11:30:00", а не "2018-01-01 11:30:00",

Просто попробуй

LogTime = datetime.strptime(columns[2].strip(" '"),"%Y-%m-%d %H:%M:%S")
0

Ваши данные, похоже, содержат цитаты, поэтому вместо "2018-01-01 11:30:00" у вас есть "2018-01-01 11:30:00" в переменной.

Вы можете разбить их по-разному, некоторые идеи ниже:

LogTime = datetime.strptime(columns[2],"'%Y-%m-%d %H:%M:%S'")

LogTime = datetime.strptime(columns[2].strip("'"),"%Y-%m-%d %H:%M:%S")

или использовать модуль csv,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню