【问题标题】:extract the day in a specific format from a date_range从 date_range 中以特定格式提取日期
【发布时间】:2017-05-04 13:59:57
【问题描述】:

我想从这个带有日期的列表中获取一个只有“天”的列表。我使用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以下的数字只有一位)

有人可以帮忙吗?
谢谢

【问题讨论】:

    标签: python date pandas


    【解决方案1】:

    您可以使用dt.strftime 创建一个日期时间字符串,然后使用astype(str) 转换为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
    

    看起来你的fechaDatetimeIndex 这不需要.dt

    new_fecha = fecha.strftime('%Y-%m-%d').str.split('-',expand=True).astype‌​(int).astype(str)
    

    所以上面应该可以工作

    【讨论】:

    • 我试过这段代码,但我得到了错误AttributeError: 'DatetimeIndex' object has no attribute 'dt'
    • 删除.dt:new_fecha = fecha.strftime('%Y-%m-%d').str.split('-',expand=True).astype(int).astype(str)
    【解决方案2】:

    您正在尝试访问 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]
    

    【讨论】:

      【解决方案3】:

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

      您创建了一个名为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
      

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

      【讨论】:

      • 感谢您的回答,所以当我执行 Fecha[i][8:10] 时,我调用的是索引 [2] 中的值,这就是为什么当我将它放在 @987654344 中时它不起作用的原因@
      • fecha[something]fecha.index 中查找something 并返回相应的值。 fecha[i]fecha.index 中查找 i 但是,i 是值本身,不在索引中。 i 采用这些值,因为您迭代了 fecha。我的回答给出了适当迭代和引用的各种方法。
      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多