从date_range中以特定格式提取日期

时间:2017-05-04 13:59:57

标签: python date pandas

我想从这个列表中得到一个只包含'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以下的数字只有一位数字)

有人可以帮忙吗? 感谢

3 个答案:

答案 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对象,索引范围从05,值是符合日期的字符串:

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