目錄
2.5.2 datetime(年,月,日,小時,....)方法
3.5.3 AttributeError: module 'datetime' has no attribute 'strftime'解決方案
5.5.2 利用writer.writerows進行文件寫入
一:要解決的問題
將相同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])