如何合并两个DataFrame列并应用pandas.to_datetime函数?

6
我正在学习使用pandas进行数据分析,所需数据以csv文件形式提供,包含多列,但我只需要其中的四列(日期、时间、o、c)。我想创建一个新的DataFrame,将DateTime64数字作为索引,该数字由合并前两列并对合并后的字符串应用pd.to_datetime得到。
我的加载代码运行良好。
st = pd.read_csv("C:/Data/stockname.txt", names=["date","time","o","h","l","c","vol"])

挑战在于将加载的DataFrame转换为新的格式正确的DataFrame。下面的代码可以工作,但速度非常慢。此外,它只创建了一个新的datetime64格式列,并未将其设置为索引。
我的代码:
st_new = pd.concat([pd.to_datetime(st.date + " " + st.time), (st.o + st.c) / 2, st.vol], 
     axis = 1, ignore_index=True)

有什么更符合Python风格的方法可以合并两列,并对结果应用函数? 如何使新列成为DataFrame的索引?
2个回答

12

您可以在read_csv函数中完成所有操作:

pd.read_csv('test.csv',
            parse_dates={'timestamp': ['date','time']},
            index_col='timestamp',
            usecols=['date', 'time', 'o', 'c'])

parse_dates参数告诉read_csv函数将datetime列合并为一列timestamp并解析为时间戳格式。(pandas智能地知道如何解析各种日期格式)

index_col参数将timestamp列设置为索引。

usecols参数告诉read_csv函数只选择子集的列。


我认为“usecols应该是['date','time','o','h','l','c','vol']”? - Jeff
他说:“其中我只需要使用4个(日期,时间,开盘价,收盘价),所以我只选择了它们。” - Viktor Kerkez
+1 我不知道那个 parse_dates 的神奇功能。@Jeff 这是新的吗? - Phillip Cloud
@ViktorKerkez 谢谢,这很有道理。不过还有一个细节,就是将函数应用于列并将它们组合成新的数据。 - Alessandro Quattrocchi
不确定您想要什么,问题还没有完成? - Viktor Kerkez
实际上,就像它被提出的那样。这个解决方案非常好。但是,这个解决方案可能不允许像(st.o + st.c) / 2这样添加两列,因为加载直接发生在DataFrame中。 - Alessandro Quattrocchi

0

关于加载数据,我认为你已经掌握了。要设置索引,请执行以下操作:

st_new = pd.concat([(st.o + st.c) / 2, st.vol], axis=1, ignore_index=True)
st_new.set_index(pd.to_datetime(st.date + " " + st.time), drop=True, inplace=True)

这里是set_index的API文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接