Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 连接CSV或表_Python_Sql_Oracle_Csv_Pandas - Fatal编程技术网

Python 连接CSV或表

Python 连接CSV或表,python,sql,oracle,csv,pandas,Python,Sql,Oracle,Csv,Pandas,我有两个不同列的csv文件。 表1 表2 title mar apr may jun date darn 0.631 1.321 0.951 1.751 5/23/2016 12:14 ok 1.001 0.247 2.456 0.3216 5/24/2016 18:41 three 0.285 1.283 0.924 956 5/25/2016 17:41 我需要按照标题(主键)和表2

我有两个不同列的csv文件。 表1

表2

title   mar      apr     may    jun      date
darn    0.631   1.321   0.951   1.751   5/23/2016 12:14
ok      1.001   0.247   2.456   0.3216  5/24/2016 18:41
three   0.285   1.283   0.924   956     5/25/2016 17:41
我需要按照标题(主键)和表2中日期字段中的时间等于表1中日期字段中的时间(时间-1小时)的条件将它们连接起来。所以输出应该是这样的:

title   stage   jan     mar     apr     may    jun     date
 darn   3.001   0.421   0.631  1.321   0.951  1.751  5/23/2016 13:14
我想知道是否可以使用Pandas或SQL查询来完成这项工作,这是最好的方法。我抬头一看,发现熊猫可以根据唯一的键值进行合并。 作为pd进口熊猫

a = pd.read_csv("1.csv")
b = pd.read_csv("2.csv")
merged = a.merge(b, on='title')
merged.to_csv("output.csv", index=False)

这是节目。我正在努力为日期字段设置条件。欢迎Bot SQL和Pandas解决方案

假设您的时间和日期变量被Pandas识别, 加上


我将创建一个虚拟列(以匹配
df
中的“时间”):

现在您可以干净地合并:

In [12]: df.merge(df1)
Out[12]:
  title  stage    jan                time    mar    apr    may    jun                date
0  darn  3.001  0.421 2016-05-23 13:14:00  0.631  1.321  0.951  1.751 2016-05-23 12:14:00

In [13]: df.merge(df1, on=["title", "time"])  # potentially less reckless to specify columns
Out[13]:
  title  stage    jan                time    mar    apr    may    jun                date
0  darn  3.001  0.421 2016-05-23 13:14:00  0.631  1.321  0.951  1.751 2016-05-23 12:14:00

注意:这意味着您不必进行完全合并(仅在标题上),这可能会导致空间效率非常低。

但此处您不匹配日期字段。我认为如果表1中有重复的标题,这将不起作用。不支持的操作数类型为-:'numpy.ndarray'和'Timedelta',您可以在匹配后进行筛选。这应该是代码的最后一行。无法连接'str'和'Hour'对象。它扔了这个error@DigantaBharali它需要是一个datetime(不是字符串)列,首先需要
df[“time”]=pd.to_datetame(df[“time”])
df
[“date”]=pd.to_datetame(df[“date”])
。这些是日期而不是字符串,因此应将其转换为字符串。您也可以在使用
parse_dates`读取csv时执行此操作。一切正常。只是它不能匹配时间列,它给了我一个空输出,只有标题。另一个问题是在合并过程中,我们能否给出“如果它在一小时内”这样的范围,它将返回该行?@DigantaBharali在一小时内肯定是另一个问题(因为您只能在相同的结果下加入)。我建议把这个问题作为一个新问题提出来,它很有趣(我不确定我知道答案,我会想一想)。
merged = merged[merged.date == (merged.time - pd.Timedelta('1 hours'))]
In [11]: df1["time"] = df1["date"] + pd.offsets.Hour(1)
In [12]: df.merge(df1)
Out[12]:
  title  stage    jan                time    mar    apr    may    jun                date
0  darn  3.001  0.421 2016-05-23 13:14:00  0.631  1.321  0.951  1.751 2016-05-23 12:14:00

In [13]: df.merge(df1, on=["title", "time"])  # potentially less reckless to specify columns
Out[13]:
  title  stage    jan                time    mar    apr    may    jun                date
0  darn  3.001  0.421 2016-05-23 13:14:00  0.631  1.321  0.951  1.751 2016-05-23 12:14:00