如何在2天内建立dt.hour

时间:2018-06-26 06:58:52

标签: python pandas dataframe

我做了多天的观察,几天后就可以观察到一位客户,这是我的数据

customer_id   value    timestamp
1             1000     2018-05-28 03:40:00.000
1             1450     2018-05-28 04:40:01.000
1             1040     2018-05-28 05:40:00.000
1             1500     2018-05-29 03:40:00.000
1             1090     2018-05-29 04:40:00.000
3             1060     2018-05-18 03:40:00.000
3             1040     2018-05-18 05:40:00.000
3             1520     2018-05-19 03:40:00.000
3             1490     2018-05-19 04:40:00.000

我所做的是df['hour'] = df['timestamp'].dt.hour,但是它只显示小时,但是我需要的是,因为实验周期可以是2-6天

customer_id   value    timestamp                hour
1             1000     2018-05-28 03:40:00.000  Day1 - 3
1             1450     2018-05-28 04:40:01.000  Day1 - 4
1             1040     2018-05-28 05:40:00.000  Day1 - 5
1             1500     2018-05-29 03:40:00.000  Day1 - 3
1             1090     2018-05-29 04:40:00.000  Day2 - 4
3             1060     2018-05-18 03:40:00.000  Day1 - 3
3             1040     2018-05-18 05:40:00.000  Day1 - 5
3             1520     2018-05-19 03:40:00.000  Day2 - 3
3             1490     2018-05-19 04:40:00.000  Day2 - 4

1 个答案:

答案 0 :(得分:2)

GroupBy.transformfactorize一起用于计数date,最后一起加入:

a = df.groupby('customer_id')['timestamp'].transform(lambda x: pd.factorize(x.dt.date)[0]) + 1

df['hour'] = 'Day' + a.astype(str) + ' - ' + df['timestamp'].dt.hour.astype(str)
print (df)
   customer_id  value           timestamp      hour
0            1   1000 2018-05-28 03:40:00  Day1 - 3
1            1   1450 2018-05-28 04:40:01  Day1 - 4
2            1   1040 2018-05-28 05:40:00  Day1 - 5
3            1   1500 2018-05-29 03:40:00  Day2 - 3
4            1   1090 2018-05-29 04:40:00  Day2 - 4
5            3   1060 2018-05-18 03:40:00  Day1 - 3
6            3   1040 2018-05-18 05:40:00  Day1 - 5
7            3   1520 2018-05-19 03:40:00  Day2 - 3
8            3   1490 2018-05-19 04:40:00  Day2 - 4

每组连续日期的替代解决方案:

dates = df['timestamp'].dt.date
a = dates.sub(dates.groupby(df['customer_id']).transform('min')).dt.days + 1