Я играю с получением строки с форматом даты и значениями, преобразованными в готовый импорт influxdb. Поэтому я пытаюсь преобразовать дату и время в отметку времени эпохи в python.
Что у меня есть до сих пор.
#Import of some modules
import re
from datetime import date
import time, os
#example text which I'll retrieve daily
txt = "daily power [{'date': datetime.datetime(2020, 12, 1, 0, 0), 'total_consumption_kwh': 0.483}, {'date': datetime.datetime(2020, 12, 2, 0, 0), 'total_consumption_kwh': 0.269}, {'date': datetime.datetime(2020, 11, 4, 0, 0), 'total_consumption_kwh': 0.611}, {'date': datetime.datetime(2020, 11, 5, 0, 0), 'total_consumption_kwh': 0.61}]"
#Regex patterns
date_regex = r'\d+,\s\d+,\s\d+'
consump_regex = r'\w+\':\s\d+.\d+'
regex_plug = r'\w+\(\d+\,\s\d+\,\s\d+\,\s\d+\,\s\d+\)\,\s\'\w+\'\:\s\d+\.\d+'
x= re.findall(regex_plug, txt)
nl = ("\n".join(x))
condition1 = str(nl).replace(",", "-")
condition2 = condition1.replace(" ", "",)
condition3 = condition2.replace("':", "': ")
condition4 = condition3.replace("(", "': ")
condition5 = condition4.replace(")-", " ")
condition6 = condition5.replace("d", "'d")
print(condition6)
приводит к:
'datetime': 2020-12-1-0-0 'total_consumption_kwh': 0.483
'datetime': 2020-12-2-0-0 'total_consumption_kwh': 0.269
'datetime': 2020-11-4-0-0 'total_consumption_kwh': 0.611
'datetime': 2020-11-5-0-0 'total_consumption_kwh': 0.61
Последний шаг — преобразовать время в отметку времени эпохи, но у меня это не работает.
Я уже нашел несколько тем, описывающих, как заменить дату на эпоху. с
date_time = '2020-12-1-0-0' #should be txt
pattern = '%Y-%m-%d-%H-%M'
epoch = int(time.mktime(time.strptime(date_time, pattern)))
print(epoch)
Но как я могу обработать это по моей строке condition6, чтобы сделать вывод:
'datetime': 1606780800 'total_consumption_kwh': 0.483
Использование eval
:
import datetime
txt = "daily power [{'date': datetime.datetime(2020, 12, 1, 0, 0), 'total_consumption_kwh': 0.483}, {'date': datetime.datetime(2020, 12, 2, 0, 0), 'total_consumption_kwh': 0.269}, {'date': datetime.datetime(2020, 11, 4, 0, 0), 'total_consumption_kwh': 0.611}, {'date': datetime.datetime(2020, 11, 5, 0, 0), 'total_consumption_kwh': 0.61}]"
daily_power = eval(txt.strip().strip("daily power"))
# Now just convert the datetimes to timestamps:
for d in daily_power:
d['date'] = d['date'].timestamp()
print(daily_power) # Yields wanted result.
Подход без использования eval
(из-за безопасности и т. д.):
from ast import literal_eval as leval
date_cons = re.findall(r'{[^\{\}]+}', txt)
for idx, dc in enumerate(date_cons):
dtnums = re.search(r'\((?:\d+,?\s*){5}\)', dc).group()
ts = datetime.datetime(*leval(dtnums)).timestamp()
date_cons[idx] = leval(re.sub('datetime\.datetime\(.+\)', str(ts), dc))
print(date_cons) # Yields wanted result.
Если вы даже не хотите использовать literal_eval
(что безопасно), вы можете просто использовать больше регулярных выражений.
@WimOrigin да, точно, если вы используете python 3.3+ datetime.datetime.timestamp() должно помочь.
Я получаю следующее сообщение: TypeError: в функции отсутствует обязательный аргумент «год» (поз. 1)
@WimOrigin работает с предоставленным вами примером строки txt
. Похоже, вы пытались проанализировать datetime.datetime
экземпляр, который не предоставляет обязательных аргументов. Например datetime.datetime()
.
Наверное, я делаю что-то глупое. Я тестирую тот же пример в w3schools.com/python/trypython.asp?filename=demo_regex. Тот же текст, который я вырезал, чтобы сделать его настоящим списком. Возможно, я неправильно ввожу dict с объектами datetime. Что вы сделали, чтобы datetime.datetime.timestamp() работал в моем исходном примере txt?
не могли бы вы опубликовать свой рабочий пример?
@WimOrigin Отредактировано. Я также добавил подход без eval
. Оба работают и обеспечивают желаемый результат.
..............................txt = "ежедневная мощность [{'дата': datetime.datetime(2020, 12, 1, 0, 0), 'total_consumption_kwh': 0,483}, daily_power = eval(txt.strip().strip("ежедневная мощность")) # Теперь просто преобразуйте дату и время в метки времени: for d в daily_power: d['date '] = d['date'].timestamp() print(daily_power) # Дает желаемый результат. Мне нужно было добавить строку, сообщающую о добавлении метки времени (CEST, +0200). Большое спасибо.
Хорошо, это oneliner, который я должен был знать раньше. Упростит приток импорта. Однако я неправильно понимаю команду datetime.datetime. Я не могу найти правильный способ изменить его на эпоху. Должно быть что-то вроде: эпоха = datetime.datetime().timestamp() ?