我不知道如何用这种格式转换“日期时间”列中的数据:
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
如何继续转换日期时间列?
正如 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'
另请参阅我的回答以获取更多信息,了解后台发生的情况。
由于您的输入似乎包含 混合 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')