Pandas 根据列值将 UNIX 时间转换为多个不同的时区
Pandas convert UNIX time to multiple different timezones depending on column value
我有一个带有 UNIX 时间戳的 pandas 数据框(这些是整数而不是时间对象)。观察发生在多个地理位置,因此发生在多个时区。 我想根据观察的地理位置将每个时区的 UNIX 时间戳转换为本地时间(在新列中)(此信息在数据框)。
简单的工作示例:
正在创建数据框:
c1=[1546555701, 1546378818, 1546574677, 1546399159, 1546572278]
c2=['America/Detroit','America/Chicago','America/Los_Angeles','America/Los_Angeles','America/Detroit']
df3=pd.DataFrame(list(zip(c1,c2)),columns=['utc','tz'])
print(df3)
预期输出:
utc tz
0 1546555701 America/Detroit
1 1546378818 America/Chicago
2 1546574677 America/Los_Angeles
3 1546399159 America/Los_Angeles
4 1546572278 America/Detroit
当前尝试:
df3['date_time']=pd.to_datetime(df3['utc'],unit='s')
print(df3)
Returns:
utc tz date_time
0 1546555701 America/Detroit 2019-01-03 22:48:21
1 1546378818 America/Chicago 2019-01-01 21:40:18
2 1546574677 America/Los_Angeles 2019-01-04 04:04:37
3 1546399159 America/Los_Angeles 2019-01-02 03:19:19
4 1546572278 America/Detroit 2019-01-04 03:24:38
这会转换为日期时间对象,但我不确定如何控制时区(我想它会给我本地时区的时间)。它当然不是基于 'tz' 列。
我查看了 pandas' tz_convert() function and the arrow package,但无法弄清楚如何使这些工作正常进行。我也对其他解决方案持开放态度。 我不仅关心时区,还关心正确处理夏令时。
假设 POSIX 时间戳(自 1970-01-01 UTC 以来的秒数),您可以使用关键字 utc=True 直接转换为 UTC。
import pandas as pd
c1=[1546555701, 1546378818, 1546574677, 1546399159, 1546572278]
c2=['America/Detroit','America/Chicago','America/Los_Angeles','America/Los_Angeles','America/Detroit']
df3=pd.DataFrame(list(zip(c1,c2)),columns=['utc','tz'])
df3['date_time']=pd.to_datetime(df3['utc'], unit='s', utc=True)
# df3['date_time']
# 0 2019-01-03 22:48:21+00:00
# 1 2019-01-01 21:40:18+00:00
# 2 2019-01-04 04:04:37+00:00
# 3 2019-01-02 03:19:19+00:00
# 4 2019-01-04 03:24:38+00:00
# Name: date_time, dtype: datetime64[ns, UTC]
然后您可以使用 apply 为每个值应用时区,例如
def setTZ(row):
return row['date_time'].tz_convert(row['tz'])
df3['date_time']=df3.apply(lambda r: setTZ(r), axis=1)
# df3
# utc tz date_time
# 0 1546555701 America/Detroit 2019-01-03 17:48:21-05:00
# 1 1546378818 America/Chicago 2019-01-01 15:40:18-06:00
# 2 1546574677 America/Los_Angeles 2019-01-03 20:04:37-08:00
# 3 1546399159 America/Los_Angeles 2019-01-01 19:19:19-08:00
# 4 1546572278 America/Detroit 2019-01-03 22:24:38-05:00
请注意,对于混合时区,您不能对系列使用 dt
访问器。您需要迭代代码,例如
df3['date_time'].apply(lambda t: t.hour)
获取每个日期时间的小时数。解决此问题的方法是创建一个具有本地时间但不识别时区的列:
def toLocalTime(row):
return row['date_time'].tz_convert(row['tz']).replace(tzinfo=None)
df3['local_time'] = df3.apply(lambda r: toLocalTime(r), axis=1)
我有一个带有 UNIX 时间戳的 pandas 数据框(这些是整数而不是时间对象)。观察发生在多个地理位置,因此发生在多个时区。 我想根据观察的地理位置将每个时区的 UNIX 时间戳转换为本地时间(在新列中)(此信息在数据框)。
简单的工作示例:
正在创建数据框:
c1=[1546555701, 1546378818, 1546574677, 1546399159, 1546572278]
c2=['America/Detroit','America/Chicago','America/Los_Angeles','America/Los_Angeles','America/Detroit']
df3=pd.DataFrame(list(zip(c1,c2)),columns=['utc','tz'])
print(df3)
预期输出:
utc tz
0 1546555701 America/Detroit
1 1546378818 America/Chicago
2 1546574677 America/Los_Angeles
3 1546399159 America/Los_Angeles
4 1546572278 America/Detroit
当前尝试:
df3['date_time']=pd.to_datetime(df3['utc'],unit='s')
print(df3)
Returns:
utc tz date_time
0 1546555701 America/Detroit 2019-01-03 22:48:21
1 1546378818 America/Chicago 2019-01-01 21:40:18
2 1546574677 America/Los_Angeles 2019-01-04 04:04:37
3 1546399159 America/Los_Angeles 2019-01-02 03:19:19
4 1546572278 America/Detroit 2019-01-04 03:24:38
这会转换为日期时间对象,但我不确定如何控制时区(我想它会给我本地时区的时间)。它当然不是基于 'tz' 列。
我查看了 pandas' tz_convert() function and the arrow package,但无法弄清楚如何使这些工作正常进行。我也对其他解决方案持开放态度。 我不仅关心时区,还关心正确处理夏令时。
假设 POSIX 时间戳(自 1970-01-01 UTC 以来的秒数),您可以使用关键字 utc=True 直接转换为 UTC。
import pandas as pd
c1=[1546555701, 1546378818, 1546574677, 1546399159, 1546572278]
c2=['America/Detroit','America/Chicago','America/Los_Angeles','America/Los_Angeles','America/Detroit']
df3=pd.DataFrame(list(zip(c1,c2)),columns=['utc','tz'])
df3['date_time']=pd.to_datetime(df3['utc'], unit='s', utc=True)
# df3['date_time']
# 0 2019-01-03 22:48:21+00:00
# 1 2019-01-01 21:40:18+00:00
# 2 2019-01-04 04:04:37+00:00
# 3 2019-01-02 03:19:19+00:00
# 4 2019-01-04 03:24:38+00:00
# Name: date_time, dtype: datetime64[ns, UTC]
然后您可以使用 apply 为每个值应用时区,例如
def setTZ(row):
return row['date_time'].tz_convert(row['tz'])
df3['date_time']=df3.apply(lambda r: setTZ(r), axis=1)
# df3
# utc tz date_time
# 0 1546555701 America/Detroit 2019-01-03 17:48:21-05:00
# 1 1546378818 America/Chicago 2019-01-01 15:40:18-06:00
# 2 1546574677 America/Los_Angeles 2019-01-03 20:04:37-08:00
# 3 1546399159 America/Los_Angeles 2019-01-01 19:19:19-08:00
# 4 1546572278 America/Detroit 2019-01-03 22:24:38-05:00
请注意,对于混合时区,您不能对系列使用 dt
访问器。您需要迭代代码,例如
df3['date_time'].apply(lambda t: t.hour)
获取每个日期时间的小时数。解决此问题的方法是创建一个具有本地时间但不识别时区的列:
def toLocalTime(row):
return row['date_time'].tz_convert(row['tz']).replace(tzinfo=None)
df3['local_time'] = df3.apply(lambda r: toLocalTime(r), axis=1)