提问人:Estraviz 提问时间:8/22/2023 更新时间:8/22/2023 访问量:38
由于 pandas 上的夏令时,无法将时间戳 (%d/%m/%Y %H:%M) 转换为索引 (Python 3)
Convert Timestamp (%d/%m/%Y %H:%M) into and index not possible due to Daylight Savings on pandas (Python 3)
问:
我正在尝试使用 pandas 读取 CSV 文件中的信息,CSV 有两列,一个时间戳(例如:31/12/2022 21:30)和一个浮点值。该文件由测量每刻钟能量组合的仪器生成。这个设备有时会出现故障,它不会记录一些季度,我想用时间和 0 值(或下一个值的平均值乘以所有跳过季度加 1)来填补这个空白。为此,我尝试使用此处给出的解决方案:
https://stackoverflow.com/questions/69205577/fill-gaps-in-time-series-pandas-dataframe
但是由于夏令时,我无法转换为索引,因为 2022 年 10 月 30 日当天的值重复。在此处输入图像描述
我试图转换为时区,但似乎不起作用:
telemedida_df=pd.read_csv("filename.csv",delimiter=";",decimal=",")
telemedida_df["Fecha/hora"]=pd.to_datetime(telemedida_df["Fecha/hora"],format='%d/%m/%Y %H:%M',utc=True)
telemedida_df["Fecha/hora"] = telemedida_df["Fecha/hora"].dt.tz_convert('Europe/Madrid')
df_new = (telemedida_df.assign(date=telemedida_df["Fecha/hora"].dt.date) #create new col 'date' from the timestamp
.set_index("Fecha/hora") #Error here
.groupby('date')
.apply(lambda x: x.resample('15Min')
.ffill())
.reset_index('date', drop=True)
.drop('date',1)
.reset_index()
)
以下错误显示“无法使用方法或限制重新索引非唯一索引”。在错误之前,数据帧如下所示:错误前的数据帧
如您所见,我在“Fecha/hora”列中没有得到 +01 和 +02。
考虑到夏令时,我如何在此处使用 transfort 日期时间编制索引?
CSV DATA 示例(它使用西班牙语逗号表示法而不是 US 点表示十进制):
Fecha/hora;Consumo
30/10/2022 0:15;6,9
30/10/2022 0:30;6,6
30/10/2022 0:45;6,7
30/10/2022 1:00;6,7
30/10/2022 1:15;6,6
30/10/2022 1:30;6,9
30/10/2022 1:45;6,8
30/10/2022 2:00;6,7
30/10/2022 2:15;6,6
30/10/2022 2:30;6,7
30/10/2022 2:45;6,7
30/10/2022 2:00;6,7
30/10/2022 2:15;6,7
30/10/2022 2:30;6,8
30/10/2022 2:45;6,7
30/10/2022 3:00;6,8
30/10/2022 3:15;6,8
30/10/2022 3:30;6,6
30/10/2022 3:45;7
30/10/2022 4:00;6,6
30/10/2022 4:15;6,8
30/10/2022 4:30;6,6
30/10/2022 4:45;6,7
30/10/2022 5:00;6,6
我尝试了不同的方法转换为时区,但没有任何结果
答:
1赞
xArbisRox
8/22/2023
#1
您提供的代码将按照编程执行时区转换。
但是,您首先将 WHOLE 系列设置为,然后将其转换为 tz 。utc
'Europe/Madrid'
这不会帮助您删除原始数据集中的任何重复项,因为您只是将整个数据集视为然后进行转换。utc
转换前的重复项将在转换后保持重复项。
- 如果测量数据确实在 中,则不会因夏令时而重复
utc
- 如果测量数据实际上是在时区(我假设的?),您将需要相应地处理它。为此,请使用 pd。Series.dt.tz_localize论点。
Europe/Madrid
ambiguous
dates = pd.Series(['2022-10-29 22:00:00', '2022-10-29 23:00:00',
'2022-10-30 00:00:00', '2022-10-30 01:00:00',
'2022-10-30 02:00:00',
'2022-10-30 02:00:00',
'2022-10-30 03:00:00', '2022-10-30 04:00:00',
'2022-10-30 05:00:00', '2022-10-30 06:00:00'])
converted = pd.to_datetime(dates).dt.tz_localize('Europe/Madrid',
ambiguous='infer')
这将导致
0 2022-10-29 22:00:00+02:00
1 2022-10-29 23:00:00+02:00
2 2022-10-30 00:00:00+02:00
3 2022-10-30 01:00:00+02:00
4 2022-10-30 02:00:00+02:00
5 2022-10-30 02:00:00+01:00
6 2022-10-30 03:00:00+01:00
7 2022-10-30 04:00:00+01:00
8 2022-10-30 05:00:00+01:00
9 2022-10-30 06:00:00+01:00
dtype: datetime64[ns, Europe/Madrid]
评论