Python 同一DatetimeIndex对象中具有不同时区的时间戳?

Python 同一DatetimeIndex对象中具有不同时区的时间戳?,python,datetime,pandas,pytz,Python,Datetime,Pandas,Pytz,是否可以将由单个时区中的时间戳组成的pd.DatetimeIndex转换为每个时间戳都有自己的时区(在某些情况下是不同的时区) 下面是我想要的一个例子: 类型(测向索引) df.index[0] Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London') df.索引[1] Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels') 如果您很高兴它不是一个索引,而只是一个常规的

是否可以将由单个时区中的时间戳组成的pd.DatetimeIndex转换为每个时间戳都有自己的时区(在某些情况下是不同的时区)

下面是我想要的一个例子:

类型(测向索引)

df.index[0]

Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London')
df.索引[1]

Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels') 

如果您很高兴它不是一个
索引
,而只是一个常规的
系列
,那么这应该可以:

pd.Series([pd.Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London'),
           pd.Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels')])
您可以使用包含不同时区的时间戳的索引。但您必须明确地将其构造为
索引

In [33]: pd.Index([pd.Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London'),pd.Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels')],dtype='object')
Out[33]: Index([2015-06-07 23:00:00+01:00, 2015-06-08 00:01:00+02:00], dtype='object')

In [34]: list(pd.Index([pd.Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London'),pd.Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels')],dtype='object'))  
Out[34]: 
[Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London'),
 Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels')]

这是一件非常奇怪的事情,而且完全没有表现。您通常希望表示一个时区(UTC或其他)。在0.17.0中,您可以有效地用时区表示单个列,因此实现我认为您的目标的一种方法是将不同的时区分隔为不同的列。请参见

将不同时区的时间戳添加到相同的
DatetimeIndex
自动生成一个
DatetimeIndex
,UTC作为默认时区。例如:

In [269]  index = pandas.DatetimeIndex([Timestamp('2015-06-07 23:00:00+0100')])

In [270]  index
Out[270]  DatetimeIndex(['2015-06-07 23:00:00+01:00'], dtype='datetime64[ns, pytz.FixedOffset(60)]', freq=None)

In [271]  index2 = DatetimeIndex([Timestamp('2015-06-08 00:01:00+0200')])

In [272]  index2
Out[272]  DatetimeIndex(['2015-06-08 00:01:00+02:00'], dtype='datetime64[ns, pytz.FixedOffset(120)]', freq=None)

In [273]  index.append(index2)  # returns single index containing both data
Out[273]  DatetimeIndex(['2015-06-07 22:00:00+00:00', '2015-06-07 22:01:00+00:00'], dtype='datetime64[ns, UTC]', freq=None)
请注意,结果是一个UTC
DatetimeIndex
,并保留了正确的UTC时间戳

同样地:

In [279]  pandas.to_datetime([Timestamp('2015-06-07 23:00:00+0100'), Timestamp('2015-06-08 00:01:00+0200')], utc=True)  # utc=True is needed
Out[279]  DatetimeIndex(['2015-06-07 22:00:00+00:00', '2015-06-07 22:01:00+00:00'], dtype='datetime64[ns, UTC]', freq=None)

这不是一件坏事,因为您可以保留正确的时间,同时能够使用
DatetimeIndex
(例如,按日期范围切片)的索引功能,同时可以轻松地将时间戳转换为任何其他时区(除非您确实需要知道每个时间戳的原始时区,否则这并不理想).

请举一个你想要的例子Hanks@Jeff,我同意你关于尽可能避免索引中使用本地时间的建议。但是在某些情况下,我们想要解决的科学问题可能与本地时间带来的现象有关。我试着举一个具体的例子。你能看一下吗?我会回答你的其他问题问题。您只需将时间保留在单独的列中-您不需要将其设置为索引(或者您可以将utc设置为索引)
In [279]  pandas.to_datetime([Timestamp('2015-06-07 23:00:00+0100'), Timestamp('2015-06-08 00:01:00+0200')], utc=True)  # utc=True is needed
Out[279]  DatetimeIndex(['2015-06-07 22:00:00+00:00', '2015-06-07 22:01:00+00:00'], dtype='datetime64[ns, UTC]', freq=None)