由于 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)

提问人:Estraviz 提问时间:8/22/2023 更新时间:8/22/2023 访问量:38

问:

我正在尝试使用 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

我尝试了不同的方法转换为时区,但没有任何结果

python-3.x 熊猫 DST

评论

0赞 D.L 8/22/2023
好吧,索引不能有重复项。因此,您必须制造不同的标签系统才能使索引独一无二......

答:

1赞 xArbisRox 8/22/2023 #1

您提供的代码将按照编程执行时区转换。 但是,您首先将 WHOLE 系列设置为,然后将其转换为 tz 。utc'Europe/Madrid'

这不会帮助您删除原始数据集中的任何重复项,因为您只是将整个数据集视为然后进行转换。utc

转换前的重复项将在转换后保持重复项。

  1. 如果测量数据确实在 中,则不会因夏令时而重复utc
  2. 如果测量数据实际上是在时区(我假设的?),您将需要相应地处理它。为此,请使用 pd。Series.dt.tz_localize论点。Europe/Madridambiguous
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]