Pandas 包含时间戳和时区列的数据框
Pandas dataframe with column of timestamps and timezones
我有一个 pandas 数据框,其中包含一列时间戳和一列时间戳所在的时区。将所有这些时间戳转换为 UTC 时间的最佳方法是什么?
csv 格式的示例数据:
0,2000-01-28 16:47:00,America/Chicago
1,2000-01-29 16:48:00,America/Chicago
2,2000-01-30 16:49:00,America/Los_Angeles
3,2000-01-31 16:50:00,America/Chicago
4,2000-01-01 16:50:00,America/New_York
这可以通过一次转换一个 tz 来有效地完成(但是因为我们有很多,groupby 已经把它们分开了)。这些是当地时间(给定时区的 IOW),因此 tz_localize
使这些时间感知。然后当我们组合它们时,它们会自动神奇地转换为 UTC。
请注意,这是在 master/0.17.0 上发布的,即将发布。 < 0.17.0 的 Soln 低于
In [19]: df = read_csv(StringIO(data),header=None, names=['value','date','tz'])
In [20]: df.dtypes
Out[20]:
value int64
date object
tz object
dtype: object
In [21]: df
Out[21]:
value date tz
0 0 2000-01-28 16:47:00 America/Chicago
1 1 2000-01-29 16:48:00 America/Chicago
2 2 2000-01-30 16:49:00 America/Los_Angeles
3 3 2000-01-31 16:50:00 America/Chicago
4 4 2000-01-01 16:50:00 America/New_York
In [22]: df['utc'] = df.groupby('tz').date.apply(
lambda x: pd.to_datetime(x).dt.tz_localize(x.name))
In [23]: df
Out[23]:
value date tz utc
0 0 2000-01-28 16:47:00 America/Chicago 2000-01-28 22:47:00
1 1 2000-01-29 16:48:00 America/Chicago 2000-01-29 22:48:00
2 2 2000-01-30 16:49:00 America/Los_Angeles 2000-01-31 00:49:00
3 3 2000-01-31 16:50:00 America/Chicago 2000-01-31 22:50:00
4 4 2000-01-01 16:50:00 America/New_York 2000-01-01 21:50:00
In [24]: df.dtypes
Out[24]:
value int64
date object
tz object
utc datetime64[ns]
dtype: object
在 < 0.17.0 中,需要:
df['utc'] = df['utc'].dt.tz_localize(None)
转换为 UTC
一般来说:合并 2 个 csv
时间 列在 导入期间(或之前)。这可以通过一个小的 lambda 函数来完成。
要转换(解析)该组合信息,有多种选择。大多数都在此处或 pandas-docs 中进行了描述。我个人喜欢 utils.parse
那个。
我有一个 pandas 数据框,其中包含一列时间戳和一列时间戳所在的时区。将所有这些时间戳转换为 UTC 时间的最佳方法是什么?
csv 格式的示例数据:
0,2000-01-28 16:47:00,America/Chicago
1,2000-01-29 16:48:00,America/Chicago
2,2000-01-30 16:49:00,America/Los_Angeles
3,2000-01-31 16:50:00,America/Chicago
4,2000-01-01 16:50:00,America/New_York
这可以通过一次转换一个 tz 来有效地完成(但是因为我们有很多,groupby 已经把它们分开了)。这些是当地时间(给定时区的 IOW),因此 tz_localize
使这些时间感知。然后当我们组合它们时,它们会自动神奇地转换为 UTC。
请注意,这是在 master/0.17.0 上发布的,即将发布。 < 0.17.0 的 Soln 低于
In [19]: df = read_csv(StringIO(data),header=None, names=['value','date','tz'])
In [20]: df.dtypes
Out[20]:
value int64
date object
tz object
dtype: object
In [21]: df
Out[21]:
value date tz
0 0 2000-01-28 16:47:00 America/Chicago
1 1 2000-01-29 16:48:00 America/Chicago
2 2 2000-01-30 16:49:00 America/Los_Angeles
3 3 2000-01-31 16:50:00 America/Chicago
4 4 2000-01-01 16:50:00 America/New_York
In [22]: df['utc'] = df.groupby('tz').date.apply(
lambda x: pd.to_datetime(x).dt.tz_localize(x.name))
In [23]: df
Out[23]:
value date tz utc
0 0 2000-01-28 16:47:00 America/Chicago 2000-01-28 22:47:00
1 1 2000-01-29 16:48:00 America/Chicago 2000-01-29 22:48:00
2 2 2000-01-30 16:49:00 America/Los_Angeles 2000-01-31 00:49:00
3 3 2000-01-31 16:50:00 America/Chicago 2000-01-31 22:50:00
4 4 2000-01-01 16:50:00 America/New_York 2000-01-01 21:50:00
In [24]: df.dtypes
Out[24]:
value int64
date object
tz object
utc datetime64[ns]
dtype: object
在 < 0.17.0 中,需要:
df['utc'] = df['utc'].dt.tz_localize(None)
转换为 UTC
一般来说:合并 2 个 csv 时间 列在 导入期间(或之前)。这可以通过一个小的 lambda 函数来完成。
要转换(解析)该组合信息,有多种选择。大多数都在此处或 pandas-docs 中进行了描述。我个人喜欢 utils.parse
那个。