【问题标题】:Why are timestamps imported via Python's numpy.loadtxt off by 6 to 7 hours?为什么通过 Python 的 numpy.loadtxt 导入的时间戳会延迟 6 到 7 小时?
【发布时间】:2016-06-28 05:23:51
【问题描述】:

我正在尝试将一些 Twitter 文本日期从文件导入 Python 数组。我写了以下函数:

import numpy as np

# Load data from a text file into an array and return the array contents
def load_text_file(file_path, file_name):
 try:
  text_data = np.loadtxt(file_path.strip() + file_name.strip(), dtype={'names': ('UserId', 'CreatedAt', 'CollectedAt', 'NumerOfFollowings', 'NumberOfFollowers', 'NumberOfTweets', 'LengthOfScreenName', 'LengthOfDescriptionInUserProfile'), 'formats': ('i8', 'datetime64[us]', 'datetime64[us]', 'i8', 'i8', 'i8', 'i8', 'i8')}, delimiter="\t")
  return text_data
 except IOError as e:
  print(e)

当我查看导入的时间戳对象时,它们似乎在一种情况下偏离了 6 小时,在另一种情况下偏离了 7 小时。以下是我尝试导入的两行数据示例:

5945472 2007-05-10 20:12:18 2009-11-17 20:09:52 156 223 2134 10 54
5947912 2007-05-10 22:08:58 2009-11-19 11:28:25  52  37  730  7 32

这些被导入到 Python 数组中,如下所示:

(5945472, datetime.datetime(2007, 5, 11, 2, 12, 18), datetime.datetime(2009, 11, 18, 3, 9, 52), 156, 223, 2134, 10, 54)
(5947912, datetime.datetime(2007, 5, 11, 4, 8, 58), datetime.datetime(2009, 11, 19, 18, 28, 25), 52, 37, 730, 7, 32)

如您所见,时间戳相差 6 小时和 7 小时。我不确定为什么。由于更改,日期更改为第二天。有人知道我如何可以完全按原样导入时间戳吗?谢谢!!!

【问题讨论】:

  • 奇怪,好像每次都加一。注意:20 -> 2 (+4)、20 -> 3 (+5)、22 -> 4 (+6) 和 11 -> 18 (+7)。
  • 我认为连续第一个时间戳增加 6 小时,第二个时间戳增加 7 小时。它实际上是 20-> 2 (+6) 而不是 +4。如果我将日期 2007-05-10 更改为 2007-11-10,则偏移量变为 +7 而不是 +6。我认为这与 YMD 与 YDM 有关。但是,我不明白为什么要增加 7 小时。我住在犹他州,比格林威治标准时间晚 7 小时。也许这与它有关。不知道如何将偏移量指定为零小时。
  • 哦,对了,我想的是 12 小时制。 :) 我在本地尝试过,得到了不同的结果:datetime.datetime(2007, 5, 11, 0, 12, 18), datetime.datetime(2009, 11, 18, 1, 9, 52)datetime.datetime(2007, 5, 11, 2, 8, 58), datetime.datetime(2009, 11, 19, 16, 28, 25)。也许这与时区有关? (虽然我不确定为什么它会根据列而改变)
  • 差异变化可能是由于夏令时。 2007 年是第 5 个月,2009 年是第 11 个月。这 2 次应该有不同的夏令时。
  • 你说他们是imported into a Python array as follows。你怎么知道?你打印数字了吗?如果是,怎么做?

标签: python numpy


【解决方案1】:

据我所知,这是 numpy 从datetime64 创建datetime 对象的结果。注意:

>>> np.datetime64('2009-11-17 20:09:52-0500')
numpy.datetime64('2009-11-17T20:09:52-0500')
>>> np.datetime64('2009-11-17 20:09:52-0500').item()
datetime.datetime(2009, 11, 18, 1, 9, 52)
>>> np.datetime64('2009-11-17 20:09:52-0500').item().tzinfo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

在本例中,我特别指定时区为 UTC-5:00。但是,datetime 对象是在没有偏移的情况下创建的;因此它显示为 UTC 时间。

那么你怎么能解决这个问题呢?您可以只在datetime64 中工作——它们已经正确指定了时区信息,因此计算应该可以正常工作。或者,如果您想使用datetime,您可以在执行任何计算之前向它们添加时区信息(即d.item().replace(tzinfo=pytz.timezone("America/New_York")))。很可能,单独使用 datetime64 会更容易。

【讨论】:

    【解决方案2】:

    我不确定这是否是您正在寻找的解决方案,但是,为什么不导入为字符串,然后创建它的日期时间对象。

    def load_text_file(file_path, file_name):
        try:
            text_data = np.loadtxt(file_path.strip() + file_name.strip(), dtype={'names': ('UserId', 'CreatedAt', 'CollectedAt', 'NumerOfFollowings', 'NumberOfFollowers', 'NumberOfTweets', 'LengthOfScreenName', 'LengthOfDescriptionInUserProfile'), 'formats': ('i8', 'a25', 'a25', 'i8', 'i8', 'i8', 'i8', 'i8')}, delimiter="\t")
            text_data2 = convert_date(text_data)
            return text_data2
        except IOError as e:
            print(e)
    
    def convert_date(text_data):
        text_data2 = list()
        for line in text_data:
            new_line = list()
            for item in line:
                if isinstance(item, str):
                    new_line.append(datetime.datetime.strptime(item, "%Y-%m-%d %H:%M:%S"))
                else:
                    new_line.append(item)
            text_data2.append(tuple(new_line))
        return text_data2
    

    这将为我返回以下内容:

    [(5945472, datetime.datetime(2007, 5, 10, 20, 12, 18), datetime.datetime(2009, 11, 17, 20, 9, 52), 156, 223, 2134, 10, 54),
    (5947912, datetime.datetime(2007, 5, 10, 22, 8, 58), datetime.datetime(2009, 11, 19, 11, 28, 25), 52, 37, 730, 7, 32)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2019-01-29
      • 2012-04-05
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      相关资源
      最近更新 更多