【问题标题】:Converting GMT to EST from CSV file using Python使用 Python 将 GMT 从 CSV 文件转换为 EST
【发布时间】:2013-11-12 01:30:32
【问题描述】:

我有一个包含日期列和时间列的 CSV 文件。时间列是 GMT(24 小时格式),我需要将其转换为 EST。因为是夏令时,现在东海岸的时差是-5小时。我需要一种方法来读取 CSV 文件并从列中的所有时间中减去 5 小时。我最大的问题是许多转换将持续两天。例如,“Thu Nov 7,0:30”将转换为“Thu Nov 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 文件、遍历时间列、减去正确的小时数,并在时间/日期更改为前一天时更改任何相应的日期。我正在使用 Python 2.7.5

感谢您的帮助!!

【问题讨论】:

  • 经典问题再次出现!你试过什么?
  • 格林威治标准时间是指UTC吗?注意:EST 缩写本身就是模棱两可的,例如,它可能指的是澳大利亚/墨尔本(尽管-5 hours 指向美国)。

标签: python datetime csv


【解决方案1】:

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

首先,显然,解析 csv 并将每一行加载到一个简单的日期时间对象(没有时区)。

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

src_tz = pytz.timezone('GMT')
dt = src_tz.localize(dt)

然后将它们转换为您想要的时区:

dst_tz = pytz.timezone('EST')
dt = dt.astimezone(dst_tz)

【讨论】:

  • 您能详细说明一下吗?这看起来像是我想要扩展的东西。您能否包含一个将 CSV 读取到天真的日期时间对象并将更改写入新文件的示例?对不起,我不是程序员,我是生物博士生。
  • @Pismo,期望我们为您编写整个程序是不合理的。如果你搜索 StackOverflow,你会发现很多关于读/写 CSV 的问题,如果你在谷歌上搜索“Python CSV 教程”,你会发现很多帮助。如果您遇到困难,请发布有关您的 CSV 问题的问题,但实际上,该基础已经很好地涵盖了,您可能只需搜索以前的问题即可回答您的问题。祝你好运,玩得开心!
【解决方案2】:

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

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

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

编辑:这里的代码使用了calendartime,但实际上并没有使用datetime。我没时间看这个了...在我的测试中,它打印了“11 月 6 日”而不是“11 月 6 日”,但这与您想要的很接近。

在将时间戳传递给此函数之前,从时间戳周围去除空格。

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.")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 2014-06-25
    • 2012-06-15
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2018-01-08
    相关资源
    最近更新 更多