为什么通过Python的numpy.loadtxt将时间戳导入6到7个小时?

时间:2016-03-13 03:22:47

标签: python numpy

我正在尝试将一些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个小时。我不知道为什么。由于更改,日期将更改为第二天。有人会知道我如何完全按原样导入时间戳吗?感谢!!!

2 个答案:

答案 0 :(得分:1)

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

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)]

答案 1 :(得分:1)

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

>>> 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一起工作将是更容易的途径。