Как заменить временную переменную в строке на эпоху

Я играю с получением строки с форматом даты и значениями, преобразованными в готовый импорт 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование 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 (что безопасно), вы можете просто использовать больше регулярных выражений.

Хорошо, это oneliner, который я должен был знать раньше. Упростит приток импорта. Однако я неправильно понимаю команду datetime.datetime. Я не могу найти правильный способ изменить его на эпоху. Должно быть что-то вроде: эпоха = datetime.datetime().timestamp() ?

Wim Origin 10.12.2020 20:35

@WimOrigin да, точно, если вы используете python 3.3+ datetime.datetime.timestamp() должно помочь.

ssp 10.12.2020 20:39

Я получаю следующее сообщение: TypeError: в функции отсутствует обязательный аргумент «год» (поз. 1)

Wim Origin 11.12.2020 18:54

@WimOrigin работает с предоставленным вами примером строки txt. Похоже, вы пытались проанализировать datetime.datetime экземпляр, который не предоставляет обязательных аргументов. Например datetime.datetime().

ssp 11.12.2020 21:00

Наверное, я делаю что-то глупое. Я тестирую тот же пример в w3schools.com/python/trypython.asp?filename=demo_regex. Тот же текст, который я вырезал, чтобы сделать его настоящим списком. Возможно, я неправильно ввожу dict с объектами datetime. Что вы сделали, чтобы datetime.datetime.timestamp() работал в моем исходном примере txt?

Wim Origin 12.12.2020 17:36

не могли бы вы опубликовать свой рабочий пример?

Wim Origin 16.12.2020 22:58

@WimOrigin Отредактировано. Я также добавил подход без eval. Оба работают и обеспечивают желаемый результат.

ssp 17.12.2020 00:11

..............................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). Большое спасибо.

raposu 07.08.2022 13:41

Другие вопросы по теме