使用DatetimeIndex索引返回Int64Index?

时间:2014-10-10 13:34:39

标签: python datetime pandas

我遇到了以下版本的奇怪问题:

  • 熊猫:0.14.1
  • Python:3.4.1 :: Anaconda 2.0.1 (x86_64)

我有以下系列(可用数据here

> my_series.head()

timestamp
2014-10-14 19:00:05.861000-04:00    6.4400
2014-10-14 19:00:07.094000-04:00    6.4400
2014-10-14 19:00:07.109000-04:00    5.9584
2014-10-14 19:00:07.211000-04:00    6.2160
2014-10-14 19:00:07.410000-04:00    6.4400
Name: quantity, dtype: float64

索引为DatetimeIndex

> my_series.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-10-14 19:00:05.861000-04:00, ..., 2014-10-14 19:06:35.307000-04:00]
Length: 2042, Freq: None, Timezone: US/Eastern

索引有重复(我需要那些条目):

> my_series.index.get_duplicates()

<class 'pandas.tseries.index.DatetimeIndex'>
[2014-10-14 23:00:10.825000, ..., 2014-10-14 23:05:49.029000]
Length: 65, Freq: None, Timezone: None

从中抽样:

现在,假设我想使用pandas.tseries.indexDatetimeIndex对象ts在特定时间点对此系列进行抽样:

> import arrow
> start_time = arrow.get(2014, 10, 14, hour = 19, tzinfo='US/Eastern')
> end_time   = start_time.replace(seconds=400)
> ts = pd.date_range(start=start_time.isoformat(), 
                     end=end_time.isoformat(), 
                     freq='2200L')

请注意:

> start_time.isoformat()
2014-10-14T19:00:00-04:00
> end_time.isoformat()
2014-10-14T19:06:40-04:00

> ts
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-10-14 19:00:00-04:00, ..., 2014-10-14 19:06:40.400000-04:00]
Length: 183, Freq: 2200L, Timezone: tzoffset(None, -14400)

当我对它进行采样时:

> my_series[ts].head()
1413327600000000000   NaN
1413327602200000000   NaN
1413327604400000000   NaN
1413327606600000000   NaN
1413327608800000000   NaN
Name: quantity, dtype: float64

我得到了一个由int64索引编制索引的系列,以及 DatetimeIndex索引(来自ts),我期望:

> my_series.ix[ts].index
Int64Index([1412636400000000000, 1412636402200000000, ...], dtype='int64')                                                      

有趣的是,int64指数似乎是“正确的”。如果我这样做:

my_series.ix[ts].index = pd.to_datetime(my_series.ix[ts].index).tz_localize('UTC').tz_convert('US/Eastern')

我可以解决问题。

为什么它会返回int64而不是DatetimeIndex?如何将其转换为后者?

1 个答案:

答案 0 :(得分:1)

这里是我看到的输入(来自泡菜,来自上面生成的ts),但不确定是什么箭头;我是从isostrings生成的

In [42]: ts
Out[42]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-10-14 19:00:00-04:00, ..., 2014-10-14 19:06:40.400000-04:00]
Length: 183, Freq: 2200L, Timezone: pytz.FixedOffset(-240)

In [43]: s.index
Out[43]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-10-14 19:00:05.861000-04:00, ..., 2014-10-14 19:06:35.307000-04:00]
Length: 2042, Freq: None, Timezone: US/Eastern

您没有任何重叠值

In [41]: s.index.tz_convert('UTC').isin(ts.tz_convert('UTC')).any()
Out[41]: False

我无法重现索引不是DatetimeIndex的错误。请注意,这是在0.15.0(今天发布)。对于tz类型的东西,已经进行了很多修复。

你正在做一个奇怪的比较,无论如何都不会工作。为了选择/重新索引这些必须是相同的tz,否则它没有任何意义。