【问题标题】:Timestamp subtraction of time arrays with different timezones不同时区时间数组的时间戳减法
【发布时间】:2015-02-01 18:56:10
【问题描述】:

我从其他有类似问题的人那里获得了以下代码,但提出的解决方案不适用于我的 DataFrame。该代码从给定日期中减去 Pandas DataFrame 索引:

my_date = pd.datetime.today()
MyDF['day_differential'] = (MyDF.index - my_date).days

在我的 DataFrame 中生成以下错误:

TypeError: Timestamp subtraction must have the same timezones or no timezones

如何找出两个日期的 tz?如何使它们相同,以便计算它们之间的天数?

【问题讨论】:

  • 其实它们的格式应该是一样的,可以打印MyDF.index吗?
  • 据我所知,这是一个时间戳列表,你正在做类似[1, 2, 3, 4, 5] - 9 我的意思是说你从一个对象列表中减去一个对象,你能清楚地定义什么你想达到吗?您想从 MyDF 中的所有日期中减去 my_date 还是尝试其他方法?
  • 试试MyDF.index.tz_convert(None) - datetime.utcnow()
  • @J.F.Sebastian 你应该把它作为答案发布,这样它就可以被接受并且这个问题不会没有答案
  • @EdChum 您可以继续将评论扩展为答案

标签: python datetime numpy pandas


【解决方案1】:

这是一个使用 J.F. Sebastian 评论的答案,非常感谢他,因为您的索引具有时区信息,那么操作也必须是时区感知的,在您的情况下,时区是 utc,因此您需要生成一个 utc 时间戳来执行减法:

In [11]:

import pandas as pd
import numpy as np
import datetime as dt
my_date = pd.datetime.today()
MyDF = pd.DataFrame({'a':np.random.randn(5)})
MyDF.index = pd.date_range('1/1/2011', periods=5, freq='H', tz='utc')
MyDF['day_differential'] = MyDF.index.tz_convert(None) - dt.datetime.utcnow()
MyDF
Out[11]:
                                  a            day_differential
2011-01-01 00:00:00+00:00  1.399602 -1493 days +13:04:06.875715
2011-01-01 01:00:00+00:00 -1.962517 -1493 days +14:04:06.875715
2011-01-01 02:00:00+00:00 -1.574531 -1493 days +15:04:06.875715
2011-01-01 03:00:00+00:00 -0.224702 -1493 days +16:04:06.875715
2011-01-01 04:00:00+00:00 -0.800772 -1493 days +17:04:06.875715

您可以通过输出索引来了解您的索引是否支持时区:

In [12]:

MyDF.index
Out[12]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2011-01-01 00:00:00+00:00, ..., 2011-01-01 04:00:00+00:00]
Length: 5, Freq: H, Timezone: UTC

与非时区感知索引比较:

In [14]:

MyDF.index
Out[14]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2011-01-01 00:00:00, ..., 2011-01-01 04:00:00]
Length: 5, Freq: H, Timezone: None

【讨论】:

    猜你喜欢
    • 2020-07-07
    • 2013-11-17
    • 2019-12-15
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多