【问题标题】:Create a python dataframe by flatten two columns通过展平两列创建 python 数据框
【发布时间】:2019-05-12 21:58:57
【问题描述】:

我有一个这样的数据框:

zip      season   season_start_date   season_end_date
zip1     winter   2015-11-25          2016-03-09

我需要将开始日期和结束日期之间的日期变平。 我希望输出是这样的:

zip       season   date   
zip1      winter   2015-11-25
zip1      winter   2015-11-26
.
.
zip1      winter   2016-03-09

我怎样才能以更优雅的方式实现?

data = {"zip":["zip1","zip1"],
    "season":["s6","s6"],
    "season_start_date": ["2011-01-01","2011-01-01"], 
    "season_end_date" : ["2012-01-05","2012-01-05"]
   }
df = pd.DataFrame(data=data)

谢谢。

【问题讨论】:

标签: python dataframe


【解决方案1】:

您需要从每一行生成一个 DataFrame,然后将它们连接在一起:

res = pd.concat([
    pd.DataFrame({
        'zip': r.zip, 'season': r.season, 'date': pd.DatetimeIndex(
            start=r.season_start_date, end=r.season_end_date, freq='D'
        )
    }) for _, r in data.iterrows()
], sort=False)

【讨论】:

    【解决方案2】:
    from datetime import datetime, timedelta
    
    Row_to_split = df.loc[1]
    Season = Row_to_split['season']
    Start_Date = datetime.strptime(Row_to_split['season_start_date']', '%Y-%m-%d')
    End_Date = datetime.strptime(Row_to_split['season_end_date']', '%Y-%m-%d')
    # initialize new_df 
    for i in range((End_Date - Start_Date).days+1):
        new_df.loc[i] = [season, (Start_Date+timedelta(i)).strftime('%Y-%m-%d')]
    

    这是否符合您的要求?我不确定 zip 列是否是索引,但应该很清楚如何插入它。

    【讨论】:

      猜你喜欢
      • 2021-03-13
      • 2020-04-24
      • 2019-12-20
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多