使用python从excel文件中转换大量时间戳的时区

使用python从excel文件中转换大量时间戳的时区,python,excel,timezone,timestamp,Python,Excel,Timezone,Timestamp,我有一个名为“hello.xlsx”的excel文件。有一列时间戳有很多行(目前超过80000行)。该文件基本上如下所示: 2018年3月29日19:24:50 2018年3月29日19:24:59 2018年3月29日19:24:59 2018年3月29日19:25:02 2018年3月29日19:25:06 2018年3月29日19:25:10 2018年3月29日19:25:20 2018年3月29日19:25:27 2018年3月29日19:25:27 2018年3月29日19:25:3

我有一个名为“hello.xlsx”的excel文件。有一列时间戳有很多行(目前超过80000行)。该文件基本上如下所示:

2018年3月29日19:24:50

2018年3月29日19:24:59

2018年3月29日19:24:59

2018年3月29日19:25:02

2018年3月29日19:25:06

2018年3月29日19:25:10

2018年3月29日19:25:20

2018年3月29日19:25:27

2018年3月29日19:25:27

2018年3月29日19:25:36

2018年3月29日19:25:49

等等

这些时间戳是UTC时间,我需要将它们转换为美国太平洋时间(UTC,-7)

我在网上搜索并尝试在excel中使用一些公式,但未能正确使用。然后我写了一段代码,如下所示:

df = pd.read_excel('hello1.xlsx', header=None)

df[0] = pd.to_datetime(df[0]).dt.astimezone(timezone('US/Pacific'))

df.to_excel('out.xlsx', index=False, header=False)
我试着运行它,但似乎有问题。我想我需要对代码的第二行进行更改或添加一些内容。我对python非常陌生,希望有人能帮我解决这个问题,我非常感谢。:)

在Excel(以及许多其他数据软件)中,时间数据以小数形式保存,整数部分为一天,浮动部分为一天的比率。因此,您基本上可以减去7/24(在Excel的时间数据格式中为7小时),以便将UTC值转换为UTC,-7

例如,当您的时间数据位于
A1
,请尝试将以下公式写入
A2

=A1-(7/24)
编辑格式:

为了将公式化的单元格视为日期/时间,我们应该相应地更改其格式。以下格式适用于这种情况:

如果要采用Python方式,则必须使用
apply
方法,并在转换之前将时间指定为UTC时间:

import pytz
df[0] = df[0].apply(lambda x: x.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('US/Pacific')).replace(tzinfo=None))
lambda操作执行3项操作:

  • 将时间记录的时区设置为UTC
  • 转换为美国/太平洋地区
  • 回到天真的时代。您需要此执行步骤才能导出到Excel。否则,Python将抛出一个错误
  • 您的
    df
    将如下所示:

                         0
    0  2018-03-29 12:24:50
    1  2018-03-29 12:24:59
    2  2018-03-29 12:24:59
    3  2018-03-29 12:25:02
    4  2018-03-29 12:25:06
    5  2018-03-29 12:25:10
    6  2018-03-29 12:25:20
    7  2018-03-29 12:25:27
    8  2018-03-29 12:25:27
    9  2018-03-29 12:25:36
    10 2018-03-29 12:25:49
    

    嗨,哈坎,谢谢你的回复。我试过你的公式,结果是一系列的整数和浮点,比如'43172.32713'。实际上我希望它是日期格式的。你有什么想法吗@哈坎·埃尔多安·斯考克·恩普尔,谢谢你的回复!我尝试了你的方法,但有一个问题显示:“TypeError:replace()不接受关键字参数”。希望你能弄明白。“)@Scratch'N”Purr@liule123您可能必须首先将记录转换为datetime。当我创建一个测试excel文件时,pandas自动将字符串识别为datetime。因此,第一次运行
    d[0]=pd.to_datetime(d[0],format=“%m/%d/%Y%H:%m:%S”)
    ,然后运行
    apply
    行。我试过了,问题解决了。谢谢!~@Scratch'N'Purr