转换日期时间列

问题描述

我不知道如何使用以下格式转换“ datetime”列中的数据:

2020-01-01T00:00:00.000+01:00

进入:

Jan-2020

我已经尝试过了:

works_data["datetime"] = pd.to_datetime(works_data["datetime"],utc=True).dt.strftime('%b-%Y')

但是不起作用...它以该格式返回日期,但少了一个月。 例如,对于2020-01-01T00:00:00.000+01:00返回Dec-2019 ...我不知道为什么...。

有人可以帮助我解决这个问题吗?

编辑:

正在运行的实际代码

import requests
import pandas as pd
import json
from pandas.io.json import json_normalize
import datetime
import time

url = "https://apidatos.ree.es/es/datos/generacion/estructura-generacion?start_date=2020-01-01T00:00&end_date=2020-12-31T22:00&time_trunc=month"


response = requests.get(url)
data = response.json()
df = pd.DataFrame(data['included'])


works_data = pd.json_normalize(data=df['attributes'],record_path='values',Meta=['title']) 

如果我打印works_data,它将返回:

value   percentage  datetime    title
0   3.726053e+06    0.163889    2020-01-01T00:00:00.000+01:00   Hidráulica
1   2.837911e+06    0.139561    2020-02-01T00:00:00.000+01:00   Hidráulica
2   3.112718e+06    0.148076    2020-03-01T00:00:00.000+01:00   Hidráulica
3   2.861429e+06    0.163464    2020-04-01T00:00:00.000+02:00   Hidráulica
4   2.858050e+06    0.159065    2020-05-01T00:00:00.000+02:00   Hidráulica
... ... ... ... ...
107 3.504687e+04    0.002002    2020-04-01T00:00:00.000+02:00   Residuos renovables
108 3.665093e+04    0.002040    2020-05-01T00:00:00.000+02:00   Residuos renovables
109 4.231355e+04    0.002197    2020-06-01T00:00:00.000+02:00   Residuos renovables
110 4.313452e+04    0.001803    2020-07-01T00:00:00.000+02:00   Residuos renovables
111 3.159610e+04    0.003548    2020-08-01T00:00:00.000+02:00   Residuos renovables

您知道如何继续转换datetime列吗?

解决方法

正如Quang Hoang所述,您正在将UTC + 1转换为UTC,这已经是一个小时了。如此,pd.to_datetime("2020-01-01T00:00:00.000+01:00",utc=True)解析为Timestamp('2019-12-31 23:00:00+0000',tz='UTC')

您似乎不想将日期转换为UTC,所以不要将相应的参数设置为True

转换字符串

import pandas as pd
pd.to_datetime("2020-01-01T00:00:00.000+01:00").strftime("%b-%Y")
>>> 'Jan-2020'

或者,仅使用datetime模块:

from datetime import datetime as dt
dt.fromisoformat("2020-01-01T00:00:00.000+01:00").strftime("%b-%Y")
>>> 'Jan-2020'

转化系列

如果要转换整个日期时间列,请使用列表推导或Pandas Series.dt.strftime函数。

import pandas as pd
dates = pd.Series(["2020-03-01T00:00:00.000+01:00","2020-01-01T00:00:00.000+01:00","2020-06-01T00:00:00.000+01:00"])
pd.to_datetime(dates).dt.strftime("%b-%Y")

>>> 0    Mar-2020
>>> 1    Jan-2020
>>> 2    Jun-2020
>>> dtype: object

当您的系列中的时区偏移量不同时,上述方法将失败。。您将收到ValueError: Tz-aware datetime.datetime cannot be converted to datetime64 unless utc=True。在这种情况下,您可以使用apply删除每个日期时间的时区信息,或按如下方式使用列表推导。

df["column"] = [pd.to_datetime(date).strftime("%b-%Y") for date in dates]
,

对于固定的UTC偏移:将日期/时间列本地化为None之前的strftime

pd.to_datetime("2020-01-01T00:00:00.000+01:00").tz_localize(None).strftime('%b-%Y')
Out[47]: 'Jan-2020'

另请参阅my answer here,以获取更多背景信息。


由于您的输入似乎包含 混合的UTC偏移量 ,因此通过to_datetime进行的转换将产生一系列datetime.datetime对象(dtype对象,如相对于dtype datetime64)。您需要将tzinfo属性替换为None

pd.to_datetime(works_data["datetime"]).apply(lambda t: t.replace(tzinfo=None)).dt.strftime('%b-%Y')