У меня есть фрейм данных со столбцом -
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
Любая помощь приветствуется.
Я отредактировал часть типов, если вы можете ответить мне на основе этого.
Это не работает, потому что вы пытаетесь преобразовать всю серию date_col в строку, а затем обработать ее как один объект datetime. datetime.fromisoformat ожидает, что вы предоставите одну строку, а не серию строк.
Вот о чем я спрашиваю: как мы можем преобразовать эту временную метку смещения utc в правильный формат даты и времени?
Вам необходимо извлечь каждый элемент один за другим из строк таблицы и преобразовать их по отдельности. Итак, вам нужен цикл, который перебирает строки вашей таблицы.
Я бы попробовал что-то вроде этого:
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')
Некоторые объяснения:
После запуска этого кода обновленный столбец в вашем DataFrame должен содержать ожидаемый выходной формат.
!!! Если строки в вашем date_col еще не указаны в формате UTC, вам необходимо настроить вызов pd.to_datetime, чтобы указать правильный часовой пояс или формат.
from datetime import datetime
, import pytz
зачем этот импорт?
Вы правы, поскольку datetime import datetime здесь излишен, изначально у меня в голове было другое решение. Но вам нужно импортировать pytz, если вы хотите запустить функцию dt.tz_convert.
нет, pytz вам тоже не нужен (кстати, pytz устарел с Python 3.9). pandas имеет встроенную функцию обработки часовых поясов (в прошлом была основана на pytz, в настоящее время основана на Zoneinfo).
Я думаю, ты можешь сделать это вот так,
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)
Похоже, что функция
str
не создает строку из поля в вашей таблице. Каковы реальные данные в таблице и откуда они берутся?