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