Преобразовать временную метку со смещением в временную метку utc в python?

У меня есть фрейм данных со столбцом -

date_col
2024-05-12T17:46:50.746922-07:00
2024-05-12T17:31:35.438304-07:00
2024-05-12T17:46:50.642095-07:00
2024-05-12T17:02:02.299320-07:00

Я попробовал код ниже -

df['updated'] = datetime.fromisoformat(str(df['date_col'])).astimezone(timezone.utc).isoformat(timespec = "milliseconds")

Но это дает ошибку -

TypeError: fromisoformat: argument must be str
print(type(df['date_col'])) gives <class 'pandas.core.series.Series'>
print(df.dypes) gives date_col object

Ожидаемый результат имеет вид - 2024-05-13T00:46:50.746Z

Любая помощь приветствуется.

Похоже, что функция str не создает строку из поля в вашей таблице. Каковы реальные данные в таблице и откуда они берутся?

OldBoy 05.06.2024 13:55

Я отредактировал часть типов, если вы можете ответить мне на основе этого.

emiley mille 05.06.2024 13:57

Это не работает, потому что вы пытаетесь преобразовать всю серию date_col в строку, а затем обработать ее как один объект datetime. datetime.fromisoformat ожидает, что вы предоставите одну строку, а не серию строк.

Nesi 05.06.2024 14:03

Вот о чем я спрашиваю: как мы можем преобразовать эту временную метку смещения utc в правильный формат даты и времени?

emiley mille 05.06.2024 14:08

Вам необходимо извлечь каждый элемент один за другим из строк таблицы и преобразовать их по отдельности. Итак, вам нужен цикл, который перебирает строки вашей таблицы.

OldBoy 05.06.2024 14:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я бы попробовал что-то вроде этого:

import pandas as pd
import pytz

# Convert the column to datetime objects
df['date_col'] = pd.to_datetime(df['date_col'], utc=True)

# Convert to UTC and format as expected
df['updated'] = df['date_col'].dt.tz_convert('UTC').dt.strftime('%Y-%m-%dT%H:%M:%S.%fZ')

Некоторые объяснения:

  1. pd.to_datetime(df['date_col'], utc=True): эта строка преобразует столбец date_col в объекты datetime, предполагая, что строки в столбце представляют время в формате UTC.
  2. df['date_col'].dt.tz_convert('UTC'): преобразует объекты datetime в часовой пояс UTC. Аксессор dt используется для операций datetime в pandas.
  3. df['date_col'].dt.tz_convert('UTC').dt.strftime('%Y-%m-%dT%H:%M:%S.%fZ'): эта строка преобразует объекты даты и времени в формате UTC. в желаемый строковый формат с помощью метода strftime. Строка формата «%Y-%m-%dT%H:%M:%S.%fZ» представляет ожидаемый выходной формат, где %f используется для микросекунд, а Z представляет часовой пояс UTC.

После запуска этого кода обновленный столбец в вашем DataFrame должен содержать ожидаемый выходной формат.

!!! Если строки в вашем date_col еще не указаны в формате UTC, вам необходимо настроить вызов pd.to_datetime, чтобы указать правильный часовой пояс или формат.

from datetime import datetime, import pytz зачем этот импорт?
Nesi 05.06.2024 14:22

Вы правы, поскольку datetime import datetime здесь излишен, изначально у меня в голове было другое решение. Но вам нужно импортировать pytz, если вы хотите запустить функцию dt.tz_convert.

David_Berlin 05.06.2024 14:46

нет, pytz вам тоже не нужен (кстати, pytz устарел с Python 3.9). pandas имеет встроенную функцию обработки часовых поясов (в прошлом была основана на pytz, в настоящее время основана на Zoneinfo).

FObersteiner 06.06.2024 10:01

Я думаю, ты можешь сделать это вот так,

import pandas as pd

# Sample DataFrame date time data stored as string.
data = {
    'date_col': [
        '2024-05-12T17:46:50.746922-07:00',
        '2024-05-12T17:31:35.438304-07:00',
        '2024-05-12T17:46:50.642095-07:00',
        '2024-05-12T17:02:02.299320-07:00'
    ]
}

df = pd.DataFrame(data)

# Converting the date_col to timezone-aware datetime objects using pd.to_datetime.
# Convert date_col to datetime objects with timezone information
df['date_col'] = pd.to_datetime(df['date_col'])

# Convert to UTC and format
df['updated'] = (df['date_col'].dt.tz_convert('UTC')
                 .dt.strftime('%Y-%m-%dT%H:%M:%S.%f').str[:-3] + 'Z')

# Check if this is what you wanted
print(df)

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