微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从时区感知 DatetimeIndex我可以绘制或减去中获取时钟时间:减去日期时没有获得预期的偏移量

如何解决如何从时区感知 DatetimeIndex我可以绘制或减去中获取时钟时间:减去日期时没有获得预期的偏移量

在 Python 和 Pandas 中处理日期时间和时间序列通常会带来一些实际问题和奇怪的设计选择。

很多时候,您想要绘制或处理没有日期组件(即只有时钟时间)的时间序列。但是,matplotlib 不能绘制 datetime.time 的数组,也不能从另一个 datetime.time 中减去一个。我认为这是一个很大的失误,但无论如何。

无论如何,为了解决这个问题,大多数来源(包括此处)建议,如果您想按一天中的时间绘制事物,您只需使用类似 datetime 的对象。例如。如果我有一个跨越几天的时间序列,我需要以某种方式确保它们看起来都在同一天。

我的意思的例子:

不能减去datetime.time,需要datetime.datetime对象:subtract two times in python

在 matplotlib 中按时间按数量绘图(参见答案 1):Plotting time in Python with Matplotlib

问题:

使用 pd.__version__ 1.1.5:

a = pd.date_range("2021-06-01","2021-06-04",freq="30min").tz_localize("CET")
t0 = dt.datetime.combine(a[0].date(),dt.time(0,0),tzinfo=pytz.timezone("CET"))

我们有t0

datetime.datetime(2021,6,1,tzinfo=<DstTzInfo 'CET' CET+1:00:00 STD>)

a

DatetimeIndex(['2021-06-01 00:00:00+02:00','2021-06-01 00:30:00+02:00','2021-06-01 01:00:00+02:00','2021-06-01 01:30:00+02:00','2021-06-01 02:00:00+02:00','2021-06-01 02:30:00+02:00','2021-06-01 03:00:00+02:00','2021-06-01 03:30:00+02:00','2021-06-01 04:00:00+02:00','2021-06-01 04:30:00+02:00',...
               '2021-06-03 19:30:00+02:00','2021-06-03 20:00:00+02:00','2021-06-03 20:30:00+02:00','2021-06-03 21:00:00+02:00','2021-06-03 21:30:00+02:00','2021-06-03 22:00:00+02:00','2021-06-03 22:30:00+02:00','2021-06-03 23:00:00+02:00','2021-06-03 23:30:00+02:00','2021-06-04 00:00:00+02:00'],dtype='datetime64[ns,CET]',length=145,freq=None)

然而,当我做a - t0

timedeltaIndex(['-1 days +23:00:00','-1 days +23:30:00','0 days 00:00:00','0 days 00:30:00','0 days 01:00:00','0 days 01:30:00','0 days 02:00:00','0 days 02:30:00','0 days 03:00:00','0 days 03:30:00',...
                  '2 days 18:30:00','2 days 19:00:00','2 days 19:30:00','2 days 20:00:00','2 days 20:30:00','2 days 21:00:00','2 days 21:30:00','2 days 22:00:00','2 days 22:30:00','2 days 23:00:00'],dtype='timedelta64[ns]',freq=None)

一个元素中的 timedelta 应为 0,并从那里增加。这是一个错误还是我做错了什么?两个物体中的一个似乎不知道 CET 的夏令时,一个知道。获得正确时间增量的一般方法是什么。

更重要的是,一劳永逸,如果我有一个pandas时间序列跨越多天,无论时区感知与否,我想:

  1. 按它们出现的一天中的时间绘制时间序列中的值。

  2. 任何形式获取它们,使我能够实际执行与日期时间对象相同的计算;即像正常人一样加、减或比较时间。

推荐的前进方式是什么(避免上述问题)?


根据评论更新:有人提到 pytz 不推荐 UTC 以外的时区,但有什么意义呢?无论如何,我有时区感知数据,我需要一种方法来执行上述操作。现在转换为 UTC 没有用:

a.tz_convert("UTC")

给予

DatetimeIndex(['2021-05-31 22:00:00+00:00','2021-05-31 22:30:00+00:00','2021-05-31 23:00:00+00:00','2021-05-31 23:30:00+00:00','2021-06-01 00:00:00+00:00','2021-06-01 00:30:00+00:00','2021-06-01 01:00:00+00:00','2021-06-01 01:30:00+00:00','2021-06-01 02:00:00+00:00','2021-06-01 02:30:00+00:00',...
               '2021-06-03 17:30:00+00:00','2021-06-03 18:00:00+00:00','2021-06-03 18:30:00+00:00','2021-06-03 19:00:00+00:00','2021-06-03 19:30:00+00:00','2021-06-03 20:00:00+00:00','2021-06-03 20:30:00+00:00','2021-06-03 21:00:00+00:00','2021-06-03 21:30:00+00:00','2021-06-03 22:00:00+00:00'],UTC]',freq=None)

问题是我需要绘制CET 时钟时间,而不是UTC+0 时钟时间。基本上,我需要将第一个元素放在图上的 0 处,其余元素放在人类根据时钟时间逻辑上放置它们的位置。

理想情况下,我可以做 a.time 并用它做算术和绘图,但有人认为不是这样,所以我需要一种解决方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。