Python 从日期范围中以特定格式提取日期

Python 从日期范围中以特定格式提取日期,python,date,pandas,Python,Date,Pandas,我想从这个有日期的列表中得到一个只有“天”的列表。我使用pd.date\u 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] 这会抛出键错误:“2017-01-01”

我想从这个有日期的列表中得到一个只有“天”的列表。我使用
pd.date\u 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]
这会抛出键错误:“2017-01-01”

据我所知,循环的
应该迭代列表,得到当天的2位数。
我之所以这样做是因为我需要用这种格式创建日期
'2017-4-4'
(因此10以下的数字只有一位)

有人能帮忙吗?

谢谢

您可以使用
dt.strftime
创建一个datetime str,然后使用
astype(str)
转换为
str
,然后在
'-'
上拆分,转换为
int
以摆脱前导的
0
,然后再转换回
str
,这样我们就可以将datetime组件重新连接在一起:

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)

因此,当您试图访问fecha中不存在的密钥时,上述操作应该有效。这种情况发生在:

for i in fecha:
    print fecha[i][8:10]
(也可能在这里:
打印fecha[2][8:10]

原因是
i
不是
fetcha
的索引,而是其中的一项

将其更改为:

for i in fecha:
    print i[8:10]


解决方法很简单,但我将尝试解释您所做的

您创建了一个名为
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
啊!这些是字符串值,而不是索引。好的,现在我们知道了这一点,我们可以解释为什么fecha[i]
不起作用。这是因为
pandas.Series
上的
[]
将尝试从索引为
i
fecha
中获取值。但是
i
是值,不是索引

以下是重做此问题的几种方法:

选项1

for i in fecha:
    print(i[8:10])

01
02
03
04
05
06
选项2

选项3

跳过series对象并从datetime索引打印


谢谢你的回答,所以当我做
Fecha[I][8:10]
时,我调用的是索引[2]中的值,这就是为什么当我把它放在
for循环中时它不起作用的原因
fecha[i]
fecha.index
中查找
i
,但是,
i
是值本身,不在索引中
i
接受这些值,因为您迭代了
fecha
。我的答案给出了各种适当迭代和引用的方法。我尝试了这段代码,但是我得到了错误:AttributeError:'DatetimeIndex'对象没有属性'dt'
删除
.dt
新建fecha=fecha.strftime(“%Y-%m-%d”).str.split('-',expand=True)。astype(int)。astype(str)
for i in fecha:
    print(i[8:10])

01
02
03
04
05
06
for i, v in fecha.iteritems():
    print(fecha[i][8:10])

01
02
03
04
05
06
for d in pd.date_range(date, periods=6):
    print(d.strftime('%d'))

01
02
03
04
05
06