數據預處理-將相同ID的字符串進行合併-時間變量操作/csv文件操作(python)

目錄

 

一:要解決的問題

二:將時間這列變爲標準時間類型

2.1問題描述

2.2 思路

2.3 輸入輸出文件說明

2.4 源代碼

2.5源代碼涉及到的方法總結

2.5.1  DataFrame 

2.5.2 datetime(年,月,日,小時,....)方法

2.5.3 DataFrame文件讀取和寫入

3.用一個整數來代表標準格式時間的特性

3.1問題描述

3.2 思路

3.3 輸入輸出文件

3.4 源代碼

3.5 源代碼涉及的知識點總結

3.5.1 字符串轉換爲列表

3.5.2 時間差計算

3.5.3  AttributeError: module 'datetime' has no attribute 'strftime'解決方案

3.5.4 將字符串變爲數字

4.人工進行粘貼複製進行數據預處理

5.文件各列合併

5.1 問題描述

5.2 思路

5.3 輸入輸出文件

5.4源代碼

5.5 源代碼涉及的知識點總結

5.5.1 Python 去除列表中重複的元素

5.5.2 利用writer.writerows進行文件寫入

6.參考文章


一:要解決的問題

     將相同ID的字符串進行合併。我們便於理解,我們要解決的問題可以使用下面三種說法,三種說法代表的含義是一樣的。類似的問題我之前使用Java解決過,具體實現過程請參考https://blog.csdn.net/yezonghui/article/details/105638382 

     網上類似問題及其解決見pandas如何將相同ID的字符串進行合併

    說法一:如圖所示,我們遇到的問題就是根據第一列的stu_id,進行具有相同stu_id的字符串進行合併。這是我們本文要解決的終極問題

    方法二:換種說法,就是要把項集類型的數據變成序列類型,即具有相同s_id的爲同一個s_id的元素。因爲我們對這個原始文件的預處理就是爲序列模式挖掘做準備的,例如處理後的文件可以作爲序列模式GSP算法的輸入文件。

    說法三:通過下面這個實際例子說明我們要解決的問題

    

id   value
1      A
1      B
1      C
2      D
2      E
2      F
變爲:
id  value
1   [A,B,C]
2   [D,E,F]

二:將時間這列變爲標準時間類型

2.1問題描述

    就是我們目前的數據年月日,時分秒的位數是不統一的,這對後面解決問題是不方便的。例如2018年3月4日。我們原始數據的格式是2018/3/4.但是爲了位數統一,便於後期變成。我們一律規範化爲2018/03/04。小時分鐘秒同理,也需要規範化。

    另外爲了與大衆化時間變量保持一致,對於時間裏面的/我們一律換爲-。例如2018年2月12日3時33分40秒。我們接下來處理爲:2018-02-12 03:00:00 即年月日與小時分鐘秒之間用空格隔開。另外我們只需要取到小時這個精度就行,因此分鐘和秒我們設置爲0

2.2 思路

1)利用panda庫裏面的DataFrame進行csv文件讀入。對讀入的文件一行一行的進行處理。

2)對每行的數據使用split('/')進行劃分,例如2017/6/1 9:02劃分後,變爲【2017, 6, 1 9:02】

3)取得第一個元素2017即年,取得第二個元素6即月,取出第三個元素。

4)對第三個元素 使用split(' '),藉助空格進行分割。例如1 9:02劃分後變爲【1 9:02】

5)取出第一個元素1即天。對第二個元素,同理使用split(':')進行分割,這樣便可以得到小時和分鐘。

6)利用datatime(年,月,日,小時)方法可以得到我們想要的標準日期形式。

7)進行結果保存,寫入到csv文件中

2.3 輸入輸出文件說明

2.3.1 輸入文件: mooctime300.csv

2.3.2 輸出文件:data200result4.csv

2.4 源代碼

import datetime
from datetime import datetime
import pandas as pd
import numpy as np

with open("mooctime300.csv") as file:
    df = pd.read_csv(file, encoding='gbk', keep_default_na=False)

    n = len(df)


with open('mooctime300.csv') as file:
    df2 = pd.read_csv(file, encoding='gbk', keep_default_na=False)

    for i in range(n):
        sb = ""
        print(i)
        str1=(df2.time[i])
        str2 = str1.split('/')
        temp1 = (int)(str2[0])
        temp2 = (int)(str2[1])
        temp3 = (int)(str2[2].split(' ')[0])
        temp4= (int)((((str2[2].split(' ')[1])).split(':'))[0])
        stamp = datetime(temp1, temp2, temp3,temp4)
        print(stamp)
        df2.time[i] = stamp
        print(df2.time[i])
    df2.to_csv('data200result4.csv', index=0)


2.5源代碼涉及到的方法總結

2.5.1  DataFrame 

    DataFrame(見參考一)是一個表格型的數據結構,它含有一組有序的列,每列可以是不同的值類型(數值、字符串、布爾值等)。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共用同一個索引)。DataFrame可以通過類似字典的方式或者.columnname的方式將列獲取爲一個Series。行也可以通過位置或名稱的方式進行獲取.

     列舉dataframe幾個常見的屬性:

 

df[val] 選取DataFrame的單個列或一組列
col、irow方法 根據整數位置選取單列或單行,並返回一個Series

 n = len(df) : 獲取Dataframe的行數;

返回列數:

df.shape[1]

返回行數:

df.shape[0]  或者 len(df)

2.5.2 datetime(年,月,日,小時,....)方法

類型 說明
date 以公曆形式存儲日曆日期(年、月、日)
time 將時間存儲爲時、分、秒、毫秒
datetime 存儲日期和時間

代碼    說明
%Y    4位數的年
%y    2位數的年
%m    2位數的月[01,12]
%d    2位數的日[01,31]
%H    時(24小時制)[00,23]
%l    時(12小時制)[01,12]
%M    2位數的分[00,59]
%S    秒[00,61]有閏秒的存在

字符串轉換成日期:datetime()方法

stamp = datetime(2017,6,27)

 

str(stamp)
    '2017-06-27 00:00:00'

2.5.3 DataFrame文件讀取和寫入

    讀入文件

with open("mooctime300.csv") as file:
    df = pd.read_csv(file, encoding='gbk', keep_default_na=False)
    n = len(df)

    寫入存儲文件

df2.to_csv('data200result4.csv', index=0)

3.用一個整數來代表標準格式時間的特性

3.1問題描述

    以2016-10-01基準,判斷時間變量與該基準相差的天數,同時對小時進行判斷,若小時位於7:00--19:00,則設置時分秒的標誌爲1,否則設置爲0.例如

2017-06-01 09:00:00 我們按照上面的要求,則設置爲2431.

3.2 思路

    問題換個想法就是計算兩個標準的時間變量之差即相差的天數。

1)利用字符串切片獲取年月日。

2)利用標準的年月日可以直接獲取時間差

3)利用切片操作獲取小時,進行比較

4)保存結果到文件

3.3 輸入輸出文件

3.3.1 輸入文件

data200result4.csv

  即上一章節中代碼的輸出結果

3.3.2

data23.csv

3.4 源代碼

import datetime
import pandas as pd
import numpy as np
def days(str1,str2):
    date1=datetime.datetime.strptime(str1[0:10],"%Y-%m-%d")
    date2=datetime.datetime.strptime(str2[0:10],"%Y-%m-%d")
    num=(date1-date2).days
    return num

def hours(str1):
    date1=datetime.datetime.strptime(str1[11:13],"%H")
    if(str1[11:13]>= '07' and str1[11:13] <= '19'):
        num6 = 1
    else:
        num6 = 0
    return num6

with open('data200result4.csv') as file:
    df2 = pd.read_csv(file, encoding='gbk', keep_default_na=False)
    for i in range(len(df2)):
        str3 = ''
        str2= df2.time[i]
        num2 = days(str2, '2016-10-01 10:19:33')
        str3= str3+str(num2)
        flag = hours(str2)
        str3 += str(flag)
        df2.time[i] = str3
        print(str3)
    df2.to_csv('data23.csv',index=0)

3.5 源代碼涉及的知識點總結

3.5.1 字符串轉換爲列表

str1 = "12345"

list1 = list(str1)

3.5.2 時間差計算

import datetime
def days(str1,str2):
    date1=datetime.datetime.strptime(str1[0:10],"%Y-%m-%d")
    date2=datetime.datetime.strptime(str2[0:10],"%Y-%m-%d")
    num=(date1-date2).days
    return num
def months(str1,str2):
    year1=datetime.datetime.strptime(str1[0:10],"%Y-%m-%d").year
    year2=datetime.datetime.strptime(str2[0:10],"%Y-%m-%d").year
    month1=datetime.datetime.strptime(str1[0:10],"%Y-%m-%d").month
    month2=datetime.datetime.strptime(str2[0:10],"%Y-%m-%d").month
    num=(year1-year2)*12+(month1-month2)
    return num

輸入days('2018-04-23 08:18:09','2017-03-21 10:19:33') ,返回398
輸入months('2018-01-23 08:18:09','2017-03-21 10:19:33'),返回10

3.5.3  AttributeError: module 'datetime' has no attribute 'strftime'解決方案

3.5.4 將字符串變爲數字

4.人工進行粘貼複製進行數據預處理

     爲後期編程作準備

1)複製粘貼原始文件的第一列s_id

2)對原始文件的第二列time,上面幾個部分已經進行處理過。對數據加上尖括號<>.

3) 對第三列的c_id加到時間後面,中間留一個空格。

這裏就不以原始數據集來舉例了,我們隨便寫幾個數據集來進行處理。

5.文件各列合併

5.1 問題描述

    在這兒我們就可以回到文章的開頭,利用上面的講解作爲基礎,這兒可以解決文章開頭提出的問題

5.2 思路

1)讀取文件,得到文件裏面各列的值

2)得到第一列不重複的值

3)每行每行逐步添加第二列的數據,添加標誌-1.

4)利用第一列不重複的值和第二列的數據進行合併

5)將文件寫入文件,逐步每行讀入,並且每行末尾添加-2

5.3 輸入輸出文件

5.3.1 輸入文件 test25.csv

5.3.2 輸出文件 test27.csv

5.4源代碼

import pandas as pd
import numpy as np
import csv

with open('test25.csv') as file:
    df3 = pd.read_csv(file, encoding='gbk', keep_default_na=False)
    df4 = df3
    n = len(df3)
    ids=((list)(df3.id))
    values = ((list)(df3.value))

data = pd.DataFrame({'id':ids,'value':values})
#print(data)

data1 = np.array(data.groupby(['id']))#按照id進行分類
# 轉變成array對象之後,可以根據data1[0][1]查看其結構

id_kinds = 2#id的種類,此例比如1、2共兩種
all_value = []
for j in range(4):
    value = []
    for i in data1[j][1]['value']:
        value.append(i)
        value.append(' -1 ')
    all_value.append(value)
#print(all_value)

list1 = list((ids))
list2 = []
for i in list1:
    if not i in list2:
        list2.append(i)

new_data = pd.DataFrame({'id':list2,'value':all_value})
print(new_data)
dataframe = pd.DataFrame({'b_name':all_value})

#將DataFrame存儲爲csv,index表示是否顯示行名,default=True
dataframe.to_csv("test26.csv",index=False,sep=',')

with open("test27.csv","w") as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow("f_name")
    #先寫入columns_name
    for m in all_value:
        list4 = ''
        list5 = []
        for n in m:
            list4 += n
        list4 += '-2'
        list5.append(list4)
        print('list5',list5)
        # 寫入多行用writerows
        writer.writerows([list5])

5.5 源代碼涉及的知識點總結

5.5.1 Python 去除列表中重複的元素

5.5.2 利用writer.writerows進行文件寫入

6.參考文章

1.DataFrame常用屬性、函數以及索引方式

pandas如何將相同ID的字符串進行合併

python+pandas+時間、日期以及時間序列處理

python 字符串(str)和列表(list)的互相轉換

python簡單獲取兩個日期之間的年度、月度、天數差的方法

將相同id對應的其他行元素合同到同一個列表中

Python 去除列表中重複的元素

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章