Вопрос или проблема
У меня есть набор данных со временем и колонками. Я хочу построить график со временем и значением. Я пробовал многие методы, но не получил правильного графика. Потому что у меня есть временной ряд. Тогда я подумал, что переведу время в UTC, а затем попробую его построить. Но у меня нет идеи, как преобразовать целый столбец в UTC. Может кто-нибудь помочь мне решить эту ошибку?
time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S"))))
Этот код для одного времени. Если я хочу преобразовать весь столбец, то что я должен сделать?
def convertTime(s):
tm = ((datetime.datetime.strptime(s, '%d/%m/%Y %H:%M'))-datetime.datetime(1970,1,1)).total_seconds()*1000
return
Я написал этот код. Но он выдал мне ошибку.
мой файл csv
Мой код:
condition = ""
date_time = []
x1 = []
x2 = []
x3 = []
def convertTime(s):
tm = time.strptime(s, " %d/%m/%Y %H:%M")
return datetime.datetime(tm.tm_year,tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec)
with open('data43.csv','r') as csv_file:
csv_data = csv.reader(csv_file, delimiter=",")
row_num = 0
for row in csv_data:
if(row_num == 0):
condition = row[0]
elif(row_num > 1): #Данные начинаются здесь
if(row[0] != ''):
date_time.append(convertTime(row[0]))
if(row[1] != ''):
x1.append(int(row[1]))
if(row[2] != ''):
x2.append(int(row[2]))
if(row[3] != ''):
x3.append(int(row[3]))
row_num = row_num + 1
fig1 = plt.figure(1)
ax = fig1.add_subplot(2,1,1)
ax.plot(date_time,x1)
ax.stem(date_time,x2,'C1--','C1o',linefmt=None, markerfmt=None, basefmt=None)
ax.stem(date_time,x3,'C2--','C2o',linefmt=None, markerfmt=None, basefmt=None)
ax.legend()
ax.xaxis_date()
ax.get_xaxis().set_major_formatter(DateFormatter('%d/%m/%Y %H:%M:%S'))
plt.xlabel('t')
plt.ylabel('k')
leg = plt.legend( loc="upper right")
plt.draw() # Нарисуйте фигуру, чтобы вы могли найти позицию легенды.
bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes)
xOffset = 0.3
bb.x0 += xOffset
bb.x1 += xOffset
leg.set_bbox_to_anchor(bb, transform = ax.transAxes)
plt.rcParams["figure.figsize"] = [20,20]
ax.plot(style=".-")
plt.show()
Один из самых простых способов решить проблему построения графика временного ряда — использовать pandas. Вы можете использовать этот код
data = pd.read_csv('YOUR_FILENAME_HERE.csv')
data['datetime'] = data['date'] + ' ' + data['time']
data['datetime'] = pd.to_datetime(data['datetime'])
data.index = data['date_time']
data.drop(['date', 'time', 'datatime'], inplace = True, axis = 1)
data['x1'].plot()
Ответ или решение
Для решения задачи преобразования времени в колонке CSV файла в формат эпохи (UTC) с использованием Python, рекомендуется использовать библиотеку pandas. Pandas предоставляет мощные средства для работы с временными рядами и значительно упрощает работу с данными из CSV файлов. Рассмотрим процесс решения задачи шаг за шагом, используя методологию TEA (Theory, Example, Application).
Теория
Поскольку задача состоит в том, чтобы преобразовать временные данные в формате строки в метку времени (timestamp), содержащую время в секундах, прошедшее с начала эпохи (1 января 1970 года), важно понимать несколько ключевых аспектов:
-
Формат времени: Для успешного преобразования строковых данных во временной формат, необходимо точно знать формат представления даты и времени. Вопрос автора подразумевает формат "%d/%m/%Y %H:%M".
-
Преобразование во временной объект: Библиотека pandas включает метод
pd.to_datetime
, который позволяет преобразовать строковые данные в объект datetime, что упрощает последующее преобразование в метку времени эпохи. -
Метка времени эпохи (Unix Timestamp): Это число секунд, прошедших с 1 января 1970 года. Этот формат часто используется в вычислительных системах и упрощает временные расчеты и сравнения.
Пример
Прежде чем перейти к практической части, приведем пример кода, который иллюстрирует процесс преобразования:
import pandas as pd
# Чтение данных из CSV файла
df = pd.read_csv('data43.csv')
# Проверяем формат даты и времени, предполагая, что это '%d/%m/%Y %H:%M'
df['datetime'] = pd.to_datetime(df['datetime'], format='%d/%m/%Y %H:%M')
# Преобразуем во временную метку эпохи
df['epoch'] = df['datetime'].view('int64') // 1_000_000_000
print(df.head())
В этом примере, мы:
- Используем метод
pd.read_csv
для чтения данных из CSV файла. - Преобразуем строковую колонку с временными данными в объект datetime.
- Получаем метку времени эпохи, преобразовывая объект datetime.
Применение
Теперь переходим к практическому применению данной методики:
-
Установка окружения: Убедитесь, что у вас установлены необходимые библиотеки. Установить pandas можно через pip:
pip install pandas
-
Импортируйте необходимые модули:
import pandas as pd import matplotlib.pyplot as plt
-
Обработка данных: Загрузите ваш CSV файл и примените преобразование времени. Центральным является корректная обработка строки datetime и преобразование её в формат Unix Timestamp:
# Загрузка данных df = pd.read_csv('data43.csv') # Соединяем две колонки, если дата и время хранятся раздельно df['datetime'] = df['date'] + ' ' + df['time'] # Преобразование строки в datetime df['datetime'] = pd.to_datetime(df['datetime'], format='%d/%m/%Y %H:%M') # Преобразование в метку времени эпохи df['epoch'] = df['datetime'].astype('int64') // 1e9 print(df.head())
-
Визуализация: Теперь, когда данные о времени представлены в формате эпохи, можно построить график временного ряда:
plt.figure(figsize=(10,6)) plt.plot(df['epoch'], df['x1'], label='X1') plt.plot(df['epoch'], df['x2'], label='X2') plt.plot(df['epoch'], df['x3'], label='X3') plt.xlabel('Время (epoch)') plt.ylabel('Значения X') plt.title('График временных рядов') plt.legend() plt.show()
Данный подход позволяет полноценно обработать временные данные и облегчает в дальнейшем построение различных графиков и анализ временных серий. С использованием pandas, библиотека которой специально оптимизирована для работы с данными в табличной форме, задача значительно упрощается. Это освобождает вас от необходимости в ручной обработке и преобразовании строк в дату и время посредством встроенных средств Python.
Таким образом, следуя вышеописанной методике, вы сможете добиться конвертации временных данных в формат метки времени эпохи, что сделает их пригодными для последующего анализа и визуализации.