首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python从CSV文件转换GMT到EST

用Python从CSV文件转换GMT到EST
EN

Stack Overflow用户
提问于 2013-11-12 01:30:32
回答 2查看 1.5K关注 0票数 1

我有一个CSV文件,它有一个日期列和一个时间列。时间列是GMT (24小时格式),我需要将它转换为EST。因为现在是夏令时,现在的时差在东海岸是-5小时。我需要一种读取CSV文件的方法,并从列中的所有时间中减去5个小时。我最大的问题是,许多转换将涵盖两天。例如,“清华11月7日0:30”将改为“清华11月6日19:30”。如果日期和时间转换为前一天,我需要更改CSV中的日期。下面是我使用的数据示例:

日期、时间

星期三11月6日0:01

11月6日,0:30,星期三

11月6日,上午8:00

11月6日,星期三13:30

清华11月7日0:30

清华11月7日2:00

清华11月7日5:00

清华11月7日15:30

清华11月7日20:00

11月8日星期五0:30

11月8日星期五2:30

11月8日星期五6:45

11月8日星期五9:30

11月8日星期五13:30

11月8日星期五17:00

11月9日,星期六1:30

星期六11月9日5:30

星期日11月10日21:45

星期日11月10:23:50

下面是我希望数据处理-5小时转换的方式:

日期、时间

星期三11月5日19:01

11月6日(星期三)19:30

11月6日星期三3:00

星期三11月6日8:30

清华11月6日19:30

清华11月6日21:00

清华11月7日0:00

清华11月7日10:30

清华11月7日15:00

11月7日星期五19:30

11月7日星期五21:30

11月8日星期五1:45

11月8日星期五4:30

11月8日星期五8:30

11月8日星期五12:00

11月8日,星期六20:30

星期六11月9日0:30

星期日11月10日16时45分

星期日11月10:18:50

我有一些代码来确定DST的状态(-4小时或-5小时)。我需要帮助读取CSV文件,迭代时间列,减去正确的小时数,如果时间/日期更改为前一天,则更改任何相应的日期。我正在使用Python2.7.5

谢谢你的帮助!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-12 01:46:38

您需要使用datetime和pytz。以下是您应该遵循的步骤:

首先,显然,解析csv并将每一行加载到一个朴素的datetime对象中(没有时区)。

其次,让datetime对象时区知道:

代码语言:javascript
复制
src_tz = pytz.timezone('GMT')
dt = src_tz.localize(dt)

然后将它们转换为所需的时区:

代码语言:javascript
复制
dst_tz = pytz.timezone('EST')
dt = dt.astimezone(dst_tz)
票数 2
EN

Stack Overflow用户

发布于 2013-11-12 01:35:31

编辑:我认为pytz的答案比这个更清晰,但我将把这个留在这里,以显示一般情况。如果你发现一个时钟快23分钟或什么的话,这个技术可以让你更正时间戳。但是pytz看起来是处理时区转换的最简单的方法。

使用datetime将日期字符串转换为单个数字(时间戳值,“划时代”以来的秒数)。通过转换为秒减去所需的时间(5小时== 5* 60 * 60)。然后使用datetime将数字转换回时间戳字符串。

datetime将为您处理边缘情况,例如日历日期的更改。它甚至应该做正确的事情,当你减去一个时间戳,它会受到夏时制或闰秒等变化的影响。

编辑:下面的代码使用calendartime,但实际上并不使用datetime。我没时间看这个..。在我的测试中,它打印的是"Nov 6“,而不是您想要的"Nov 06”,但这与您想要的非常接近。

在将时间戳传递给此函数之前,从时间戳周围提取空白。

代码语言:javascript
复制
import calendar
import time

def convert_ts(timestamp, change):
    temp = time.strptime(timestamp, "%a %b %d,%H:%M")
    t = calendar.timegm(temp)
    t += change
    temp = time.gmtime(t)
    return time.strftime("%a %b %0d,%H:%M", temp)

编辑:好的,这是一个完整的程序,它实现了上面的内容并包含了测试用例。当我测试上面的内容时,我发现平日是不对的,我想这是因为时间戳不包括年份。因此,我添加了一个default_year参数。

您可以编写代码来计算当前的年份,如果有人要求的话,我会添加这一点。

代码语言:javascript
复制
s = """\
Wed Nov 6,0:01 
Wed Nov 6,0:30 
Wed Nov 6,8:00 
Wed Nov 6,13:30 
Thu Nov 7,0:30 
Thu Nov 7,2:00 
Thu Nov 7,5:00 
Thu Nov 7,15:30 
Thu Nov 7,20:00 
Fri Nov 8,0:30 
Fri Nov 8,2:30 
Fri Nov 8,6:45 
Fri Nov 8,9:30 
Fri Nov 8,13:30 
Fri Nov 8,17:00 
Sat Nov 9,1:30 
Sat Nov 9,5:30 
Sun Nov 10,21:45 
Sun Nov 10,23:50"""
data = [line.strip() for line in s.split('\n')]

s = """\
Tue Nov 5,19:01 
Tue Nov 5,19:30 
Wed Nov 6,3:00 
Wed Nov 6,8:30 
Wed Nov 6,19:30 
Wed Nov 6,21:00 
Thu Nov 7,0:00 
Thu Nov 7,10:30 
Thu Nov 7,15:00 
Thu Nov 7,19:30 
Thu Nov 7,21:30 
Fri Nov 8,1:45 
Fri Nov 8,4:30 
Fri Nov 8,8:30 
Fri Nov 8,12:00 
Fri Nov 8,20:30 
Sat Nov 9,0:30 
Sun Nov 10,16:45 
Sun Nov 10,18:50"""
correct = [line.strip() for line in s.split('\n')]

import calendar
import time
import re

pat_lead0 = re.compile(r'([ ,])0(\d)')

def convert_ts(timestamp, default_year, change):
    temp = time.strptime(timestamp + " %04d" % default_year, "%a %b %d,%H:%M %Y")
    t = calendar.timegm(temp)
    t += change
    temp = time.gmtime(t)
    s = time.strftime("%a %b %0d,%H:%M", temp)
    s = re.sub(pat_lead0, r'\1\2', s)
    return s

offset = -5 * 60 * 60  # seconds in five hours
for s, k in zip(data, correct):
    result = convert_ts(s, 2013, offset)
    if result != k:
        print("result: '{}'  correct: '{}'".format(result, k))
print("Done.")
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19919276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档