Python:转置数据以在两个日期之间创建每月的记录

时间:2017-11-08 05:03:55

标签: python python-3.x pandas date numpy

我有一个如下所示的数据集:

Category    Date 1     Date 2 
a         2017-01-01  2017-08-01

我希望能够转换这些数据,以便我在两个日期之间每个月都有一个记录 例如

Category Date
a        2017-01-01
a        2017-02-01
a        2017-03-01
.....
a        2017-08-01

我需要在python中执行此操作,我的数据已经在pandas数据框中。日期采用日期戳格式YYYY-MM-DD

2 个答案:

答案 0 :(得分:6)

$row = fgetcsv($file); // Don't modify the original data (unless you need to) and // remove duplicate calls to strtolower() $r6 = strtolower($row[6]); // Only test against lower case letters, " should not be needed if ($r6 == 'plenty of stock available!' || $r6 == 'lowstock') { // perform correction / change $row[6] = '10'; } else if ($r6 == 'nostock') { // perform correction / change $row[6] = '2'; }

使用理解
pd.date_range

如果您有超过3列,并且只想pd.DataFrame( [[c, d] for c, d1, d2 in df.itertuples(index=False) for d in pd.date_range(d1, d2, freq='MS')], columns=['Category', 'Date'] ) Category Date 0 a 2017-01-01 1 a 2017-02-01 2 a 2017-03-01 3 a 2017-04-01 4 a 2017-05-01 5 a 2017-06-01 6 a 2017-07-01 7 a 2017-08-01 Category

Date

pd.DataFrame( [[c, d] for c, d1, d2, *_ in df.itertuples(index=False) for d in pd.date_range(d1, d2, freq='MS')], columns=['Category', 'Date'] ) 解包其余的元组。

否则,我们可以捕获整个元组,只需抓住我们需要的位。

*_

答案 1 :(得分:3)

我不确定日期时间格式是m-d-y还是d-m-y ...您也可以将resample('D')替换为resample('MS')获取月份开始。

df.melt('Category').set_index('value').resample('D').first().ffill().drop('variable',1)
Out[31]: 
           Category
value              
2017-01-01        a
2017-01-02        a
2017-01-03        a
2017-01-04        a
2017-01-05        a
2017-01-06        a
2017-01-07        a
2017-01-08        a

更改为MS

df.melt('Category').set_index('value').resample('MS').first().ffill().drop('variable',1)
Out[40]: 
           Category
value              
2017-01-01        a
2017-02-01        a
2017-03-01        a
2017-04-01        a
2017-05-01        a
2017-06-01        a
2017-07-01        a
2017-08-01        a