问题描述
我不知道如何使用以下格式转换“ 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')