鉴于具有日期列和值列的数据集,我需要提出根据值列中的趋势按日期细分数据的最佳解决方案。我的输出应为CSV文件,其列为:StartDate,EndDate,StartValue,EndValue。开始日期和结束日期定义了细分的范围。 给出了一个简短的示例:输入数据:
**Date** **Value**
01/01/2014 10
01/02/2014 5
01/03/2014 5
01/04/2014 0
输出:
**StartDate** **EndDate** **StartValue** **EndValue**
01/01/2014 01/15/2014 10 5
01/16/2014 02/03/2014 5 5
02/04/2014 03/10/2014 5 4
答案 0 :(得分:1)
使用pandas.DataFrame.shift
(docs)的方法。
首先,我将创建一个包含一些数据的数据框:
import pandas as pd
datelist = pd.date_range('1/1/2019', periods=100).tolist()
values = np.random.randint(1, 5, 100)
df = pd.DataFrame({'Date': datelist, 'Value': values})
df = df.set_index('Date')
df.head(10)
Date Value
2019-01-01 1
2019-01-02 4
2019-01-03 2
2019-01-04 2
2019-01-05 2
2019-01-06 3
2019-01-07 2
2019-01-08 2
2019-01-09 3
2019-01-10 2
连续丢弃重复的行:
df = df.loc[df.Value.shift() != df.Value]
Date Value
2019-01-01 2
2019-01-02 1
2019-01-04 2
2019-01-05 3
2019-01-06 1
重置索引(如果Date
列是原始数据中的索引):
df = df.reset_index()
将现有列重命名为开始列。
df.columns = ['Start_Date', 'Start_Value']
通过将起始列移回第一行来创建末列。
df['End_Date'] = df.Start_Date.shift(-1)
df['End_Value'] = df.Start_Value.shift(-1)
丢弃NaN(由于shift(-1)
,数据帧的最后一行。
df = df.dropna()
将End_Value
类型设置为int
(如果需要)。
df['End_Value'] = df['End_Value'].astype(int)
df.head(10)
Start_Date Start_Value End_Date End_Value
0 2019-01-01 1 2019-01-02 4
1 2019-01-02 4 2019-01-03 2
2 2019-01-03 2 2019-01-06 3
3 2019-01-06 3 2019-01-07 2
4 2019-01-07 2 2019-01-09 3
5 2019-01-09 3 2019-01-10 2
6 2019-01-10 2 2019-01-11 1
7 2019-01-11 1 2019-01-12 2
8 2019-01-12 2 2019-01-15 1
9 2019-01-15 1 2019-01-16 4
从数据框创建CSV文件:
df.to_csv('trends.csv')