使用.csv标头(字符串日期)作为变量

时间:2019-03-26 15:40:30

标签: python python-3.x datetime

我有一个索引重新平衡信息(组成部分x重新平衡生效日期)的csv文件,并想确定每个重新平衡日期之间的天数。我已经到了能够隔离标题行并将每个日期从字符串转换为datetime的地步。我在弄清楚如何选择列表中的特定项目以将其从另一个项目中减去以计算增量时遇到问题。尝试选择特定项目时,出现以下错误:

  

“ TypeError:列表索引必须是整数或切片,而不是元组”。

我尝试将日期时间结果转换为int,但得到:

  

“属性错误:'列表'对象没有属性'类型'”

在我项目的其他部分,我仅对日期(索引列[0]中的日期)进行了索引,并测试了从其他列中提取正确数据的位置,但这在这里无效。我仍然需要找到delta(days)并将该天数转换为(int),以便我们可以迭代下一步。

以下是导入和提取标题的代码:

basketfile = "C:\\....\\Test_Baskets.csv"
rebaldates = pd.read_csv(basketfile, nrows=0)
newdates = [datetime.strptime(x, '%m/%d/%Y') for x in rebaldates]

这给了我

In [141]: newdates
Out[141]: 
[datetime.datetime(2010, 12, 31, 0, 0),
 datetime.datetime(2007, 12, 31, 0, 0),
 datetime.datetime(2008, 6, 20, 0, 0),
 datetime.datetime(2008, 12, 19, 0, 0),
 datetime.datetime(2009, 6, 19, 0, 0),
 datetime.datetime(2009, 12, 18, 0, 0),
 datetime.datetime(2010, 6, 18, 0, 0),
 datetime.datetime(2010, 12, 17, 0, 0)]

我希望能够使用每个元素来计算增量,但是在尝试选择特定元素时出现此错误:

newdates[:, :8]
Traceback (most recent call last):
   File "<ipython-input-142-34368864ad97>", line 1, in <module>
    newdates[:, :8]
TypeError: list indices must be integers or slices, not tuple

我希望将日期字符串转换为日期时间后,就可以像使用数字一样使用它们了,但是显然,我还需要采取其他步骤来格式化项目或存储它们的方式。我只是不确定那是什么...

1 个答案:

答案 0 :(得分:1)

您仅使用列表:

newdates = [datetime.strptime(x, '%m/%d/%Y') for x in rebaldates]
print(newdates)

输出:

[datetime.datetime(2010, 12, 31, 0, 0),
 datetime.datetime(2007, 12, 31, 0, 0),
 datetime.datetime(2008, 6, 20, 0, 0),
 datetime.datetime(2008, 12, 19, 0, 0),
 datetime.datetime(2009, 6, 19, 0, 0),
 datetime.datetime(2009, 12, 18, 0, 0),
 datetime.datetime(2010, 6, 18, 0, 0),
 datetime.datetime(2010, 12, 17, 0, 0)]

newdates[:, :8]

是numpy样式切片-普通列表中不支持-您只能使用整数进行切片:my_list[inclusive_start:exclusive_stop:steps](所有整数)

要计算(成对)增量,您可以执行以下操作:

import datetime

newdates=[datetime.datetime(2010, 12, 31, 0, 0),
     datetime.datetime(2007, 12, 31, 0, 0),
     datetime.datetime(2008, 6, 20, 0, 0),
     datetime.datetime(2008, 12, 19, 0, 0),
     datetime.datetime(2009, 6, 19, 0, 0),
     datetime.datetime(2009, 12, 18, 0, 0),
     datetime.datetime(2010, 6, 18, 0, 0),
     datetime.datetime(2010, 12, 17, 0, 0)]

zipper = zip(newdates,newdates[1:])

delta = [(a-b) for a,b in zipper]

print(delta)
print( [d.days for d in delta] )

输出:

[datetime.timedelta(1096), datetime.timedelta(-172), datetime.timedelta(-182),
 datetime.timedelta(-182), datetime.timedelta(-182), datetime.timedelta(-182), 
 datetime.timedelta(-182)]
[1096, -172, -182, -182, -182, -182, -182]

请参阅: