转换日期时间列

问题描述 投票:0回答:2

我不知道如何用这种格式转换“日期时间”列中的数据:

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

如何继续转换日期时间列?

python python-3.x pandas date datetime
2个回答
1
投票

正如 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]

1
投票

对于固定的 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')
© www.soinside.com 2019 - 2024. All rights reserved.