我有一个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
谢谢你的帮助!!
发布于 2013-11-12 01:46:38
您需要使用datetime和pytz。以下是您应该遵循的步骤:
首先,显然,解析csv并将每一行加载到一个朴素的datetime对象中(没有时区)。
其次,让datetime对象时区知道:
src_tz = pytz.timezone('GMT')
dt = src_tz.localize(dt)然后将它们转换为所需的时区:
dst_tz = pytz.timezone('EST')
dt = dt.astimezone(dst_tz)发布于 2013-11-12 01:35:31
编辑:我认为pytz的答案比这个更清晰,但我将把这个留在这里,以显示一般情况。如果你发现一个时钟快23分钟或什么的话,这个技术可以让你更正时间戳。但是pytz看起来是处理时区转换的最简单的方法。
使用datetime将日期字符串转换为单个数字(时间戳值,“划时代”以来的秒数)。通过转换为秒减去所需的时间(5小时== 5* 60 * 60)。然后使用datetime将数字转换回时间戳字符串。
datetime将为您处理边缘情况,例如日历日期的更改。它甚至应该做正确的事情,当你减去一个时间戳,它会受到夏时制或闰秒等变化的影响。
编辑:下面的代码使用calendar和time,但实际上并不使用datetime。我没时间看这个..。在我的测试中,它打印的是"Nov 6“,而不是您想要的"Nov 06”,但这与您想要的非常接近。
在将时间戳传递给此函数之前,从时间戳周围提取空白。
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参数。
您可以编写代码来计算当前的年份,如果有人要求的话,我会添加这一点。
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.")https://stackoverflow.com/questions/19919276
复制相似问题