将带有多个时区的熊猫列转换为单个时区



问题

我在Pandas DataFrame中有一个列,其中包含带有时区的时间戳。本列中存在两个不同的时区,我需要确保只有一个。这是列的结尾的输出:

260003    2019-05-21 12:00:00-06:00
260004    2019-05-21 12:15:00-06:00
Name: timestamp, Length: 260005, dtype: object

对于它的价值,时间戳在-06:00-07:00之间有所不同,并且具有以下输出:

datetime.datetime(2007, 10, 1, 1, 0, tzinfo=tzoffset(None, -21600))用于-06:00 datetime.datetime(2007, 11, 17, 5, 15, tzinfo=tzoffset(None, -25200))用于-07:00

我做了什么

过去,我一直在尝试使用tz.lacalize and tz.convert,这些tz.convert在过去效果很好,但是我想数据只有一个时区。例如,如果我这样做:

df['timestamp'].dt.tz_localize('MST', ambiguous='infer').dt.tz_convert('MST')

我得到:

ValueError: Array must be all same time zone
During handling of the above exception, another exception occurred:
ValueError: Tz-aware datetime.datetime cannot be converted to datetime64 unless utc=True

问题

有没有办法将其转换为MST?还是时区,真的吗?我想我可以通过时区分解数据框(不是100%确定如何,但我认为这是可能的(,并在其中的块上行动,但是我想我要看看那里是否有一个更聪明的解决方案。谢谢!

我尝试了:

df = pd.DataFrame({'timestamp':['2019-05-21 12:00:00-06:00',
                                '2019-05-21 12:15:00-07:00']})
df['timestamp'] = pd.to_datetime(df.timestamp)
df.timestamp.dt.tz_localize('MST')

工作正常,给予:

0   2019-05-21 18:00:00-07:00
1   2019-05-21 19:15:00-07:00
Name: timestamp, dtype: datetime64[ns, MST]

这不是您期望的?


编辑:感谢 @g.anderson的评论,我尝试了使用时区感知时间戳的不同数据:

df = pd.DataFrame({'timestamp':[pd.to_datetime('2019-05-21 12:00:00').tz_localize('MST'),
                         pd.to_datetime('2019-05-21 12:15:00').tz_localize('EST')]})

然后

df['timestamp'] = pd.to_datetime(df.timestamp)

确实给出了相同的错误。然后我添加了utc=True

df.timestamp = pd.to_datetime(df.timestamp, utc=True)
# df.timestamp
# 0   2019-05-21 19:00:00+00:00
# 1   2019-05-21 17:15:00+00:00
# Name: timestamp, dtype: datetime64[ns, UTC]
df.timestamp.dt.tz_convert('MST')

工作正常,给予:

0   2019-05-21 12:00:00-07:00
1   2019-05-21 10:15:00-07:00
Name: timestamp, dtype: datetime64[ns, MST]
# input data
import pandas as pd
series = pd.Series(data=
    [pd.to_datetime('2019-01-01 00:00:00').tz_localize('MST'),
     pd.to_datetime('2019-01-01 01:10:00').tz_localize('UTC')])
print(series)

给出

0    2019-01-01 00:00:00-07:00
1    2019-01-01 01:10:00+00:00
dtype: object

确实,

series.dt.tz_convert('MST')

给出" valueerror:array必须是相同的时区" " valueerror:tz-waw award dateTime.dateTime不能转换为datetime64,除非utc = true true" 。因此,看来,您必须以一种非矢量化的方式进行:

new_series = pd.Series(index=series.index,
    data=[x.tz_convert('MST') for x in series])
print(new_series)

给出

0   2019-01-01 00:00:00-07:00
1   2018-12-31 18:10:00-07:00
dtype: datetime64[ns, MST]

编辑:如果@quanghoang正确(即"该选项自动将时间戳本地定位到UTC" ,请仔细检查它!(有关pd.to_datetime(..., utc=True)的含义,则以下解决方案也将起作用:

new_series = pd.to_datetime(series, utc=True).dt.tz_convert('MST')
print(new_series)

给出

0   2019-01-01 00:00:00-07:00
1   2018-12-31 18:10:00-07:00
dtype: datetime64[ns, MST]

让我们有一个具有多个不同时区的a系列。我们期望a.tz_convert()a.tz_localize()工作,但它们不行。解决方案是使用apply方法。请参阅下面的示例:

> a
0    2019-10-04 16:30:00+02:00
1    2019-10-07 16:00:00-04:00
2    2019-09-24 08:30:00-07:00
Name: localized, dtype: object
> a.iloc[0]
Timestamp('2019-10-04 16:30:00+0200', tz='Europe/Amsterdam')
> a.apply(lambda x: x.tz_convert('America/Los_Angeles'))
0   2019-10-04 07:30:00-07:00
1   2019-10-07 13:00:00-07:00
2   2019-09-24 08:30:00-07:00
Name: localized, dtype: datetime64[ns, America/Los_Angeles]
# Make it tz-naive, i.e. remove tz info, note you lose information here, you might want to store tz-info in another series before the conversion.
> a.apply(lambda x: x.tz_localize(None))
0   2019-10-04 16:30:00
1   2019-10-07 16:00:00
2   2019-09-24 08:30:00
Name: localized, dtype: datetime64[ns]

相关内容

  • 没有找到相关文章

最新更新