将具有日期时间值的列转换为每周的列

时间:2019-04-23 00:24:42

标签: python pandas

我的数据看起来像

color  |  date      | sales
green  | 2018-04-19 |   6
red    | 2018-12-01 |   3
blue   | 2018-09-14 |   7
 .     |     .      |   .
 .     |     .      |   .

所有日期都在2018年1月1日至2019年1月1日之间,并且颜色列中有许多颜色重复多次。例如,红色可能出现在各个日期,绿色可能出现在相同的日期。有数千条记录和与此查询无关的其他几列。

我将其放在数据框中,并按date列升序排序并重置索引。但是,我想做的是每周创建一列,其中每一行都是唯一的颜色,以及该周内该颜色的销售额之和。

我认为类似df_sales['date'].resample('W').sum()之类的东西然后旋转数据可能会解决问题,但这是行不通的。我知道为了使用resample,我需要通过date将索引设置为df_sales.set_index(pd.DatetimeIndex(df_sales['date']), inplace=True)列。但是运行print(df_shoes['date'].resample('W'))只会给我DatetimeIndexResampler [freq=<Week: weekday=6>, axis=0, closed=right, label=right, convention=start, base=0],对我没有太大帮助。

它根本不允许我使用sum()函数。

理想情况下,我的结果看起来像(或类似情况,每列为一周):

color  |  2018-01-01  | 2018-01-08  | ... | 2018-12-24
green  |      14      |      0      | ... |     6
indigo |      9       |      3      | ... |     18

任何可以帮助我实现这一目标的方法都很棒!

谢谢

2 个答案:

答案 0 :(得分:1)

让我们再尝试一次。

将列日期转换为时间戳记

df['date']=pd.to_datetime(df['date']).dt.date

然后 找到一周的开始位置

 df['BeginWeek']=df['date']-pd.DateOffset(weekday=0,weeks=1)

然后遍历结果

df_pivot=df.pivot_table(index='color',columns='BeginWeek',values='sales',aggfunc='sum').fillna(0)

答案 1 :(得分:1)

好的,现在我理解了您的问题,您可以尝试:

# toy data frame
np.random.seed(2019)
dates = pd.date_range('2018-01-01', '2018-1-21', freq='D')
colors = np.random.randint(0,3, len(dates))
values = np.random.normal(10,20, len(dates))

df = pd.DataFrame({'dates': dates,
                   'colors': colors,
                   'values': values})    

df.groupby('colors').resample(rule='W', on='dates').values.sum().reset_index()

输出:

+---+--------+------------+------------+
|   | colors |   dates    |   values   |
+---+--------+------------+------------+
| 0 |      0 | 2018-01-07 | 103.963813 |
| 1 |      0 | 2018-01-14 | 52.569041  |
| 2 |      0 | 2018-01-21 | 67.987307  |
| 3 |      1 | 2018-01-07 | 2.940078   |
| 4 |      1 | 2018-01-14 | -18.655026 |
| 5 |      1 | 2018-01-21 | -7.875686  |
| 6 |      2 | 2018-01-07 | 21.254167  |
| 7 |      2 | 2018-01-14 | 8.990712   |
| 8 |      2 | 2018-01-21 | -4.180851  |
+---+--------+------------+------------+