问题
我在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]