【问题标题】:Parsing python list of dates into a pandas DataFrame将python日期列表解析为pandas DataFrame
【发布时间】:2018-07-16 06:58:58
【问题描述】:

需要一些帮助/建议如何将日期转换为 Pandas DataFrame。我的 Python 列表如下所示:

['',
 '20180715:1700-20180716:1600',
 '20180716:1700-20180717:1600',
 '20180717:1700-20180718:1600',
 '20180718:1700-20180719:1600',
 '20180719:1700-20180720:1600',
 '20180721:CLOSED',
 '20180722:1700-20180723:1600',
 '20180723:1700-20180724:1600',
 '20180724:1700-20180725:1600',
 '20180725:1700-20180726:1600',
 '20180726:1700-20180727:1600',
 '20180728:CLOSED']

有没有一种简单的方法可以将其转换为具有两列(开始时间和结束时间)的 Pandas DataFrame?

【问题讨论】:

    标签: pandas datetime python-3.6


    【解决方案1】:

    示例:

    L = ['',
     '20180715:1700-20180716:1600',
     '20180716:1700-20180717:1600',
     '20180717:1700-20180718:1600',
     '20180718:1700-20180719:1600',
     '20180719:1700-20180720:1600',
     '20180721:CLOSED',
     '20180722:1700-20180723:1600',
     '20180723:1700-20180724:1600',
     '20180724:1700-20180725:1600',
     '20180725:1700-20180726:1600',
     '20180726:1700-20180727:1600',
     '20180728:CLOSED']
    

    我认为这里最好的方法是使用列表推导并按分隔符拆分并过滤掉没有拆分器的值:

    df = pd.DataFrame([x.split('-') for x in L if '-' in x], columns=['start','end'])
    print (df)
               start            end
    0  20180715:1700  20180716:1600
    1  20180716:1700  20180717:1600
    2  20180717:1700  20180718:1600
    3  20180718:1700  20180719:1600
    4  20180719:1700  20180720:1600
    5  20180722:1700  20180723:1600
    6  20180723:1700  20180724:1600
    7  20180724:1700  20180725:1600
    8  20180725:1700  20180726:1600
    9  20180726:1700  20180727:1600
    

    Pandas 解决方案也是可能的,特别是如果需要处理Series - 这里使用splitdropna

    s = pd.Series(L)
    
    df = s.str.split('-', expand=True).dropna(subset=[1])
    df.columns = ['start','end']
    print (df)
                start            end
    1   20180715:1700  20180716:1600
    2   20180716:1700  20180717:1600
    3   20180717:1700  20180718:1600
    4   20180718:1700  20180719:1600
    5   20180719:1700  20180720:1600
    7   20180722:1700  20180723:1600
    8   20180723:1700  20180724:1600
    9   20180724:1700  20180725:1600
    10  20180725:1700  20180726:1600
    11  20180726:1700  20180727:1600
    

    【讨论】:

    • 两者都在工作,但显然还不是日期时间。使用 apply 来转换它们?
    • @steff - 嗯,所以列表不同?有一些嵌套值吗?
    • 我有一个函数可以将它解析成正确的形状,但它非常适合这种情况。可以简单地应用它
    • @steff - 最后一步需要将输出列转换为日期时间吗?
    • @steff - 所以需要df = df.apply(lambda x: pd.to_datetime(x, format='%Y%m%d:%H%M'))
    猜你喜欢
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2018-05-18
    相关资源
    最近更新 更多