我想从这个列表中得到一个只包含'day'的列表,其中包含日期。我使用pd.date_range
生成了日期,然后将其转换为字符串。
date = '20170101'
fecha = pd.date_range(date , periods = 6, freq = 'D')
fecha = pd.Series(fecha.format())
print fecha[2][8:10]
for i in fecha:
print fecha[i][8:10]
这会引发KeyError: '2017-01-01'
根据我的理解,for loop
应该遍历列表并获得当天的2位数字
我这样做的原因是因为我需要使用这种格式创建日期'2017-4-4'
(所以10以下的数字只有一位数字)
有人可以帮忙吗? 感谢
答案 0 :(得分:1)
您可以使用dt.strftime
创建日期时间str,然后使用str
转换为astype(str)
,然后将'-'
转换为int
以摆脱领先的0
,然后您返回str
,以便我们可以再次将日期时间组件重新加入:
In [105]:
new_fecha = fecha.dt.strftime('%Y-%m-%d').str.split('-',expand=True).astype(int).astype(str)
new_fecha[0] + '-' + new_fecha[1] + '-' + new_fecha[2]
Out[105]:
0 2017-1-1
1 2017-1-2
2 2017-1-3
3 2017-1-4
4 2017-1-5
5 2017-1-6
dtype: object
您的fecha
似乎是DatetimeIndex
,这不需要.dt
:
new_fecha = fecha.strftime('%Y-%m-%d').str.split('-',expand=True).astype(int).astype(str)
所以上面应该有效
答案 1 :(得分:1)
您正尝试访问fecha
中不存在的密钥。这发生在:
for i in fecha:
print fecha[i][8:10]
(可能在这里:print fecha[2][8:10]
)
原因是i
不是fetcha
的索引,而是其中的项目。
将其更改为:
for i in fecha:
print i[8:10]
或
for i in range(len(fecha)):
print fecha[i][8:10]
答案 2 :(得分:1)
修复很简单,但我会尝试解释你做了什么。
你创建了一个名为fecha
的变量,它是一个pandas.Series
对象,索引范围从0
到5
,值是符合日期的字符串:
print(fecha)
0 2017-01-01
1 2017-01-02
2 2017-01-03
3 2017-01-04
4 2017-01-05
5 2017-01-06
dtype: object
# ^
# Notice dtype object. Usually indicative of strings.
现在当您使用for
循环进行迭代时,您是否正在迭代索引?还是价值观?换句话说,什么是i
?
打印并查看
for i in fecha:
print(i)
2017-01-01
2017-01-02
2017-01-03
2017-01-04
2017-01-05
2017-01-06
AHHHH!这些是字符串值而不是索引。好的,既然我们知道这一点,我们可以解释为什么fecha[i]
没有用。这是因为[]
上的pandas.Series
会尝试从fecha
获取其索引为i
的值。但! i
是值,不是索引。
以下是一些重做此问题的方法:
选项1
for i in fecha:
print(i[8:10])
01
02
03
04
05
06
选项2
iteritems
for i, v in fecha.iteritems():
print(fecha[i][8:10])
01
02
03
04
05
06
选项3
.strftime
also See This Link for strftime
跳过系列对象并从日期时间索引打印
for d in pd.date_range(date, periods=6):
print(d.strftime('%d'))
01
02
03
04
05
06