数据格式如下:
首先我们先了解datetime库与pd时间序列的区别与联系 可以看下博文
https://blog.csdn.net/qq_24753293/article/details/80954840
首先不管是datetime中的strptime strftime 还是pandas中的pd.to_datetime 都需要对数据格式进行统一
即我们的 %Y-%m-%d %H:%M:%S 必须和我们数据一致才能转换。(由字符串变成时间格式必须统一符合,由时间转为字符串可以随意改成自己想要的格式。)
我们原始时间格式为:01-10月-18 04.03.16.705 上午
并没有一个合适的符号能够匹配秒以下的单位和上午这个单位 ,因此我们需要对数据进行处理一下 ,弄成符合转换标准的时间格式。
我们针对此字符串进行了以下转换:
DATE = "2018/10/18"
def change(data_time): #处理时间格式
list_time1=[]
for x in data_time:
if x[-2:] == '下午':
time1 = DATE + ' ' + str(int(x[10:12])+12) + ':' + x[13:15] + ':' + x[16:18]
list_time1.append(time1)
else:
time2 = DATE + ' ' + x[10:12] + ':' + x[13:15] + ':' + x[16:18]
list_time1.append(time2)
return list_time1
这样就可以弄成我们想要的格式。
df=pd.read_csv(r'C:\Users\Administrator\Desktop\ceshi.csv',encoding='gbk')
print(type(df['BILLTIME']))
change_time = change(df['BILLTIME']) # df['TIME']是pandas类型 处理的函数必须是遍历的形式 并不是一个具体的数
df["TIME_change"] = change_time
print(type(change_time)) #
print(type(df["TIME_change"]))#
同时我们注意,列表格式可以对series格式的进行赋值。
下面我们正式谈下datetime库和pandas的时间序列库的区别与联系了。
一,想把字符转换为时间列(一整列):
第一种方法是利用pandas.to_datetime
df["TIME_change"] = pd.to_datetime(df["TIME_change"],format="%Y-%m-%d %H:%M:%S")
利用pd的时间序列函数 最大的好处是可以处理整个字段的数据 即,利用pd.to_datetime函数即可。
第二种方法是利用datetime模块中datetime库中的strptime函数。此函数可以使字符类型变成时间格式。但是想要把整个字段全部转换,必须依赖apply函数和lambda函数 使每一行都转换过来。
df['TIME_change']=df['TIME_change'].apply(lambda x: datetime.datetime.strptime(x,"%Y/%m/%d %H:%M:%S"))
注:当str->datetime时 strptime,strftime必须有前缀datetime 。 datetime.strptime(x,"%Y/%m/%d %H:%M:%S")
当datetime->str时 strptime,strftime可以没有前缀,时间格式的字段直接调用。x.strftime("%Y-%m-%d %H:%M:%S")
如果直接调用就会出现下面的报错。
df['TIME_change']=df['TIME_change'].apply(lambda x: x.strftime("%Y-%m-%d %H:%M:%S"))
AttributeError: 'str' object has no attribute 'strftime'
二,想把时间转为字符(一整列):
这里主要是利用datetime库,和上面一样。时间转字符有个优点就是可以直接调用内置函数X.strptime的形式
df['TIME_change']=df['TIME_change'].apply(lambda x: x.strftime("%Y-%m-%d %H:%M:%S"))