gpt4 book ai didi

python - Pandas read_csv : parsing time field correctly

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:10 24 4
gpt4 key购买 nike

我有以下原始数据,

TranID,TranDate,TranTime,TranAmt
A123456,20160427,02:18,9999.53
B123457,20160426,02:48,26070.33
C123458,20160425,03:18,13779.56
A123459,20160424,03:18,18157.26
B123460,20160423,04:18,215868.15
C123461,20160422,04:18,23695.25
A123462,20160421,05:18,57
B123463,20160420,05:18,64594.24
C123464,20160419,06:18,47890.91
A123465,20160427,06:18,14119.74
B123466,20160426,07:18,2649.6
C123467,20160425,07:18,16757.38
A123468,20160424,08:18,8864.78
B123469,20160423,08:18,26254.69
C123470,20160422,09:18,13206.98
A123471,20160421,09:18,15872.45
B123472,20160420,10:18,197621.18
C123473,20160419,10:18,21048.72

我尝试使用 pd read_csv 导入原始数据,

尝试1

import numpy as np
import pandas as pd

df = pd.read_csv('MyTest.csv', sep=',', header=0, parse_dates=['TranDate'],
usecols=['TranID','TranDate','TranTime','TranAmt'],
engine='python')
print(df.dtypes)
df[:5]

输出1

TranID              object
TranDate datetime64[ns]
TranTime object
TranAmt float64
dtype: object
Out[12]:
TranID TranDate TranTime TranAmt
0 A123456 2016-04-27 02:18 9999.53
1 B123457 2016-04-26 02:48 26070.33
2 C123458 2016-04-25 03:18 13779.56
3 A123459 2016-04-24 03:18 18157.26
4 B123460 2016-04-23 04:18 215868.15

尝试2

import numpy as np
import pandas as pd

df = pd.read_csv('MyTest.csv', sep=',', header=0, parse_dates=['TranDate', 'TranTime'],
usecols=['TranID','TranDate','TranTime','TranAmt'],
engine='python')
print(df.dtypes)
df[:5]

输出2

TranID              object
TranDate datetime64[ns]
TranTime datetime64[ns]
TranAmt float64
dtype: object
Out[13]:
TranID TranDate TranTime TranAmt
0 A123456 2016-04-27 2016-04-27 02:18:00 9999.53
1 B123457 2016-04-26 2016-04-27 02:48:00 26070.33
2 C123458 2016-04-25 2016-04-27 03:18:00 13779.56
3 A123459 2016-04-24 2016-04-27 03:18:00 18157.26
4 B123460 2016-04-23 2016-04-27 04:18:00 215868.15

我对 TranTime 列感到困惑。在 Try1 中,它显示正确,但 dtype 是对象。在 Try2 中,pd 将当前日期添加到时间中,dtype 为 datetime。

我希望将此 TranTime 列视为时间,并希望使用 pd 的 groupby 或 pivot_table 执行聚合。如果我使用 Try1 方法,对象 dtype 会影​​响我的聚合吗?如果我使用 Try2 方法,是否需要去掉日期部分才能使用时间部分?

我精通 SAS,其中 SAS 具有日期、时间和日期时间信息和格式,其中基础数据类型仅为数字。因此我对 Python 的对象和日期时间数据类型感到困惑。

谢谢,大堂

最佳答案

在 Python 中,日期时间通常表示为 datetime.datetime 对象。这些不是很有效,这就是 Pandas 使用数字时间戳的原因。

读取数据(注意 parse_dates 参数两边的双括号):

df = pd.read_csv(filename, parse_dates=[['TranDate', 'TranTime']])

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 18 entries, 0 to 17
Data columns (total 3 columns):
TranDate_TranTime 18 non-null datetime64[ns]
TranID 18 non-null object
TranAmt 18 non-null float64
dtypes: datetime64[ns](1), float64(1), object(1)

>>> df.head()
TranDate_TranTime TranID TranAmt
0 2016-04-27 02:18:00 A123456 9999.53
1 2016-04-26 02:48:00 B123457 26070.33
2 2016-04-25 03:18:00 C123458 13779.56
3 2016-04-24 03:18:00 A123459 18157.26
4 2016-04-23 04:18:00 B123460 215868.15

日期和时间列已合并为一列。一旦你有了这个时间戳,就可以很容易地使用 dt 访问器访问它的属性,例如

>>> df.groupby(df.TranDate_TranTime.dt.hour).TranAmt.sum().head()
TranDate_TranTime
2 36069.86
3 31936.82
4 239563.40
5 64651.24
6 62010.65
Name: TranAmt, dtype: float64

>>> df.groupby(df.TranDate_TranTime.dt.day).TranAmt.sum().head()
TranDate_TranTime
19 68939.63
20 262215.42
21 15929.45
22 36902.23
23 242122.84
Name: TranAmt, dtype: float64

有关 Pandas date functionality 的更多信息,请参阅 Pandas 文档。

关于python - Pandas read_csv : parsing time field correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36878242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com