Pandas:从CSV中读取一个含有datetime类型的DataFrame、单项时间数据获取

前言

有一个CSV文件test.csv,其中有一列是datetime类型,其他列是数值列,就像下边这样:

 

问题

1、读取该CSV文件,把datetime列转换为datetime类型,并将它设置为索引列;

2、筛选时间在15:58到16:03之间的行。

解决

①导入相关模块;

import pandas as pd

②读取test.csv;

data=pd.read_csv('test.csv',encoding='GBK',names=['DT','Changes'],header=0)

结果

复制代码
data
                 DT   Changes
0   2021/5/22 15:58 -1041.690
1   2021/5/22 15:59 -1041.770
2   2021/5/22 16:01 -1041.050
...
15  2021/5/22 16:20  -997.787
16  2021/5/22 16:22  -994.114
17  2021/5/22 16:23 -1007.710
复制代码

在看data各列的类型:

data.dtypes
DT          object
Changes    float64
dtype: object

可见我们的datetime数据读进来之后就变成了object类型,而不是datetime类型

③将DT列由Object类型转化为datetime类型;

data = data.assign( DT=pd.to_datetime(data['DT'] ))

这里用到了两个函数assign()to_datetime():

assign():插入新列,如果新旧列名相同,会覆盖旧列;

to_datetime():Series转换为datetime类型。

所以上述代码的意思就是:把data的'DT'列转化为datetime类型,把转换后的DT覆盖原来的DT列。

如果想看这两个函数的具体用法,可以看:

Python:pandas(三)——DataFrame - ShineLe - 博客园

Python:pandas(二)——pandas函数 - ShineLe - 博客园

④把DT列设置为Index列;

data = data.set_index('DT')

结果

复制代码
data.set_index('DT')
                      Changes
DT                           
2021-05-22 15:58:00 -1041.690
2021-05-22 15:59:00 -1041.770
2021-05-22 16:01:00 -1041.050
...
2021-05-22 16:20:00  -997.787
2021-05-22 16:22:00  -994.114
2021-05-22 16:23:00 -1007.710
复制代码

类型

data.dtypes
DT         datetime64[ns]
Changes           float64
dtype: object

转换完成!

⑤筛选时间在15:58到16:03之间的行。

data_choose=data.between_time('15:58','16:03')

结果

                     Changes
DT                          
2021-05-22 15:58:00 -1041.69
2021-05-22 15:59:00 -1041.77
2021-05-22 16:01:00 -1041.05
2021-05-22 16:02:00 -1041.49

前边之所以做那么多,就是为了最后的筛选,由于between_time只能对indexdatetime类型的数据进行筛选,所以前边要把datetime变成index列

关于between_time,可以参考Python:pandas(三)——DataFrame - ShineLe - 博客园

 

完整代码

import pandas as pd

data = pd.read_csv('test.csv', encoding='GBK', names=['DT', 'Changes'], header=0)
data = data.assign(DT=pd.to_datetime(data['DT']))
data = data.set_index('DT')
data_choose = data.between_time('15:58', '16:03')

 

补充

1、将某个datetime数据项转化为datetime.datetime类型

转到上文④,我们再看data及其中索引列DT的数据类型:

复制代码
data
                      Changes
DT                           
2021-05-22 15:58:00 -1041.690
2021-05-22 15:59:00 -1041.770
2021-05-22 16:01:00 -1041.050
...
2021-05-22 16:20:00  -997.787
2021-05-22 16:22:00  -994.114
2021-05-22 16:23:00 -1007.710
data.dtypes
DT         datetime64[ns]
Changes           float64
dtype: object
复制代码

发现索引列DT列的数据类型是

datetime64[ns]

它并不是我们常用datetime.datetime类型,那么如何把它转换为datetime.datetime呢?

问题

我们如何要提取倒数第二个索引 2021-05-22 16:22:00,并且把它正确地转为datetime.datetime呢?

 

解决

提取该项元素,调用它的to_pydatetime()方法,即可得到一个datetime.datetime

dt=data.index[-2].to_pydatetime()

结果

datetime.datetime(2021, 5, 22, 0, 0)

 

2、将同时包含datetime.datetime和datetime.date类型的索引列中的各项索引,全部转化为datetime.date(如果已经是datetime.date则忽略)

问题

假设我们的数据索引列像下边这样,同时包含datetime和date,很不协调,那么如何把它们全部变成date类型呢?

 

 

解决

data_date = map(lambda x:x.to_pydatetime().date() if isinstance(x,datetime) else x,list(backavgDf.index))
data_date = list(data_date) df
= df.assign(date=data_date) df.set_index('date')

 

posted @   ShineLe  阅读(2642)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示