Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据列值将UNIX时间转换为多个不同的时区_Python_Pandas_Datetime_Timezone_Dst - Fatal编程技术网

Python 根据列值将UNIX时间转换为多个不同的时区

Python 根据列值将UNIX时间转换为多个不同的时区,python,pandas,datetime,timezone,dst,Python,Pandas,Datetime,Timezone,Dst,我有一个带有UNIX时间戳的数据帧(这些是整数而不是时间对象)。这些观测发生在多个地理位置,因此有多个时区我想根据观测的地理位置将UNIX时间戳转换为每个时区的本地时间(在新列中)(此信息在数据框的一列中) 简单的工作示例: 创建数据帧: c1=[1546555701, 1546378818, 1546574677, 1546399159, 1546572278] c2=['America/Detroit','America/Chicago','America/Los_Angeles','Ame

我有一个带有UNIX时间戳的数据帧(这些是整数而不是时间对象)。这些观测发生在多个地理位置,因此有多个时区我想根据观测的地理位置将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)
返回:

          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
这将转换为datetime对象,但我不确定如何控制时区(我想它会给我本地时区中的时间)。这当然不是基于“tz”一栏

我已经研究了熊猫的功能和功能,但还没有弄清楚如何让它们发挥作用。我也愿意接受其他解决方案我不仅关心时区,而且还要确保夏令时得到正确处理。

假设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)

这些不是UTC时间戳。它们可能是Unix时间戳。这不是吹毛求疵。在Unix系统之外,编程时间戳通常意味着完整的ISO8601时间戳。在数据库中,
时间戳
类型或其等价物是日期+时间value@PanagiotisKanavos你是对的,我已经相应地修改了问题。如果你只需要使用这些时间戳,我建议将其保留在UTC中,并保留时区信息。我只会转换成一个特定的tz,如果你需要它来做演示或做其他事情(需要它是人类可读的)。@MrFuppes我需要能够比较底特律早上5点的观察结果和波士顿早上5点的观察结果。这似乎需要转换,不是吗?我(可能很明显)不熟悉使用时间戳,所以我愿意接受建议和改进的工作流程;混合时区可以,但不能使用
dt
访问器,因此单个时间戳属性更难提取。我假设tz_convert()也处理夏令时,对吗?@amquack:是的。你是对的,正如你提到的,对于比较来说,转换成时区似乎更容易。既然您有IANA时区名称,这应该不会引起任何问题。但是,由于您有混合时区,
dt
访问器将无法工作-这可能会有点痛苦,因为您需要交互式代码。我想知道是否有一种方法可以做到这一点而不必逐行进行。您提到了dt访问器(我不确定那是什么)。但我想知道这是否是一个有用的工具,通过在转换之前按时区排序来加快速度。我这样问是因为这已经成为我过程中的瓶颈。最初的“to_datetime()函数非常快,但是时区转换非常慢(我想是因为它是逐行转换的)@amquack:对于我所不知道的混合时区。这也是为什么我建议将其保持在UTC,因为这部分很快。