Python 转换日期时间列
我不知道如何使用以下格式转换我列“datetime”中的数据:Python 转换日期时间列,python,python-3.x,pandas,date,datetime,Python,Python 3.x,Pandas,Date,Datetime,我不知道如何使用以下格式转换我列“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:0
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
返回2019年12月
。。。我不知道为什么
有人能帮我解决这个问题吗
编辑:
正在工作的实际代码
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_数据,它会返回:
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)
解析为时间戳('2019-12-31 23:00:00+0000',tz='utc')
似乎您不想将日期转换为UTC,因此不要将相应的参数设置为True
转换字符串
或者,仅使用datetime
模块:
from datetime import datetime as dt
dt.fromisoformat("2020-01-01T00:00:00.000+01:00").strftime("%b-%Y")
>>> 'Jan-2020'
转换系列
如果要转换整个datetimes列,请使用列表理解或PandasSeries.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无法转换为datetime64,除非utc=True
。在这种情况下,您可以使用apply
删除每个datetime的时区信息,或者使用如下列表理解
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偏移量,因此通过
到_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')
考虑到时区是
+1
,也就是说,+01:00
中的2020-01-01 00:00:00
时区在格林尼治标准时间仍然在2019
中,我觉得这听起来很合理。所以。。我怎样才能修复它?嗨@sabacherli谢谢你的回答!!如果我没有将utc设置为True,则会出现此错误…如果我使用您的第一个选项/pd.to\u datetime(works\u data[“datetime”])。strftime(“%b-%Y”)
我有此错误“对象”系列没有属性“strftime”有关详细信息,我的“datetime”列是Dtype=objectI,我也有同样的问题….Tz-aware-datetime.datetime无法转换为datetime64,除非utc=True
我刚刚发布了我的所有代码,请检查一下好吗?谢谢@MrFruppes我已经尝试过了,但返回了这个索引不是有效的DatetimeIndex或PeriodIndex
@rogarui:hm,似乎您想将其应用于df的索引,但它以前没有被强制转换为\u datetime?我不知道发生了什么…我创建了我的df,当我尝试转换该列时,返回了太多错误。。。你喜欢我发布全部代码吗?我只是发布所有代码,你能检查一下吗@MrFuppes@rogarui-您的数据包含混合UTC偏移量pd.to_datetime
无法推断相应的pytz.fixed_偏移量,因此。。。是时候做一个lambda
:)(见我的答案编辑)
pd.to_datetime(works_data["datetime"]).apply(lambda t: t.replace(tzinfo=None)).dt.strftime('%b-%Y')