将datetime列转换为不同的时区pandas

tre*_*nch 9 python pandas

我有两个日期时间列,当我将它们读入内存但实际上在美国/东部时它们是天真的.我只想将这两列转换为US/Central.

我发现了一种有效的方法,但似乎我正在做一个解决方法.我将call_start和call_end列改为名为'start'和'end',因此我最终没有重复的列名.然后,我为每个列创建了一个单独的datetimeindex并重置索引.

aht.set_index(pd.DatetimeIndex(aht['start']).tz_localize('US/Eastern').tz_convert('US/Central'), inplace = True, drop = True)
aht.index.names = ['call_start']
aht = aht.reset_index()
aht.set_index(pd.DatetimeIndex(aht['end']).tz_localize('US/Eastern').tz_convert('US/Central'), inplace = True, drop = True)
aht.index.names = ['call_end']
aht = aht.reset_index()
Run Code Online (Sandbox Code Playgroud)

我最终得到:

call_end    call_start  start   end
2016-01-13 06:05:01-06:00   2016-01-13 06:02:00-06:00   01/13/2016 07:02    01/13/2016 07:05
2016-01-13 06:07:00-06:00   2016-01-13 06:03:16-06:00   01/13/2016 07:03    01/13/2016 07:07
2016-01-13 06:09:13-06:00   2016-01-13 06:06:02-06:00   01/13/2016 07:06    01/13/2016 07:09
2016-01-13 06:17:51-06:00   2016-01-13 06:06:20-06:00   01/13/2016 07:06    01/13/2016 07:17
Run Code Online (Sandbox Code Playgroud)

这是最好的方法吗?所有其他数据都在中央时间,所以我只是想确保这个文件太合并,当我将文件合并在一起时更有意义.我不关心那里有实际的时区标记 - 有没有办法在我创建新列后轻松剥离它?

jor*_*ris 21

您不需要执行到DatetimeIndex的往返,因为这些方法对于Series(列)以及dt访问者都是可用的:

aht['call_start'] = aht['start'].dt.tz_localize('US/Eastern').dt.tz_convert('US/Central')
Run Code Online (Sandbox Code Playgroud)

同样的end.
要删除时区信息但保留在当地时间,.dt.tz_localize(None)之后再进行一次(请参阅此问题:https://stackoverflow.com/a/34687479/653364)

  • 从那时起,情况发生了变化:-) 在 pandas 0.15 中添加了日期时间访问器,正是为了更轻松地访问 Series 中日期时间数据的这些 DatetimeIndex 方法。 (2认同)