python将多个数据框与日期合并

赛义德·古达

这段代码的目的是抓取一堆 URL,然后从每个 URL 中提取数据表。

将表转换为 Pandas 数据框,固定日期,删除不必要的列,重命名列,最后将它们全部组合成一个统一的数据框,以日期为索引,这样数据将按日期排序,以便发生的事件同时应该在同一行。拼接前的原始数据:

Release Date Argentina Economic Activity YoY

0 2018-10-25 21:00:00+02:00                           -1.6%

1 2018-09-26 21:00:00+02:00                           -2.7%

2 2018-08-23 21:00:00+02:00                           -6.7%

3 2018-07-24 21:00:00+02:00                           -5.8%

4 2018-06-26 21:00:00+02:00                           -0.9%

               Release Date Argentina Gross Domestic Product (GDP) YoY

0 2018-09-19 22:00:00+02:00                                      -4.2%

1 2018-06-19 21:00:00+02:00                                       3.6%

2 2018-03-21 21:00:00+02:00                                       3.9%

3 2017-12-20 22:00:00+02:00                                       4.2%

4 2017-09-21 21:00:00+02:00                                       2.7%

但是连接后发生的事情是不同的日期在同一行,所以假设它们是 3 个表,我会在第一行中找到三个日期,然后是第二行......等等。

像这样:

2018-01-24 22:00:00+02:00, 2016-06-29 21:00:00...                            3.9%                                       0.5%

(2018-02-28 22:00:00+02:00, 2016-09-22 21:00:00...                            2.0%                                      -3.4%

(2018-03-28 21:00:00+02:00, 2016-12-22 22:00:00...                            4.1%                                      -3.8%

(2018-04-24 21:00:00+02:00, 2017-03-21 21:00:00...                            5.1%                                      -2.1%

这是代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
import pandas as pd
from datetime import datetime
from tzlocal import get_localzone
import time


class DataEngine:
    def __init__(self):
        self.urls = open(r"C:\Users\Sayed\Desktop\sample.txt").readlines()
        self.driver = webdriver.Chrome(r"D:\Projects\Tutorial\Driver\chromedriver.exe")
        self.wait = WebDriverWait(self.driver, 10)
        self.time = time.time()

    def title(self):
        names = []
        for url in self.urls:
            self.driver.get(url)
            title = self.driver.title
            names.append(title)
        return names

    def table(self):
        DataFrames = []
        for url in self.urls:
            self.driver.get(url)
            while True:
                try:
                    item = self.wait.until(
                        ec.visibility_of_element_located((By.XPATH, '//*[contains(@id,"showMoreHistory")]/a')))
                    self.driver.execute_script("arguments[0].click();", item)
                except Exception:
                    break

            df = pd.DataFrame(columns=['Release Date', 'Time', 'Actual', 'Forecast', 'Previous'])
            pos = 0
            for table in self.wait.until(
                    ec.visibility_of_all_elements_located((By.XPATH, '//*[contains(@id,"eventHistoryTable")]//tr'))):
                data = [item.text for item in table.find_elements_by_xpath(".//*[self::td]")]
                if data:
                    df.loc[pos] = data[0:5]
                    pos += 1
            df = df.head(10)
            DataFrames.append(df)
        return DataFrames

    def date(self):

        dfs = []
        tables = self.table()
        for df in tables:
            Dates = []
            df["Date"] = df["Release Date"].apply(lambda x: x[:12]) + " " + df["Time"]
            for date in df["Date"]:
                date = datetime.strptime(date.strip(), '%b %d, %Y %H:%M')
                Dates.append(date)
            df["Date"] = Dates
            df['Date'] = df['Date'].dt.tz_localize('US/Eastern').dt.tz_convert(get_localzone())
            df = df[['Date', 'Actual', 'Forecast', 'Previous', 'Release Date', 'Time']]
            df = df.drop(df.columns[-4:], axis=1).reset_index(drop=True)

            dfs.append(df)

        return dfs

    def rename(self):
        FinalDataFrames = []
        tables = self.date()
        names = self.title()
        for name, table in zip(names, tables):
            table.rename(columns={'Date': 'Release Date', 'Actual': name}, inplace=True)
            table['Release Date'] = pd.to_datetime(table['Release Date'])
            FinalDataFrames.append(table)
        return FinalDataFrames

    def update(self):
        dfs = self.rename()
        for df in dfs:
            last_read = df.iloc[0, 0]
            latest_release_date = self.driver.find_element_by_xpath('//*[@id="releaseInfo"]/span[1]/div').text
            latest_release_time = self.driver.find_elements_by_css_selector('td.left')[1].text
            latest = latest_release_date + ' ' + latest_release_time
            latest = pd.to_datetime(latest)
            latest_release = latest.tz_localize('US/Eastern').tz_convert(get_localzone())
            if last_read == latest_release:
                pass
            else:
                self.rename()

    def final_df(self):
        self.update()
        while True:
            dfs = self.rename()
            df = pd.concat(dfs, axis=1, join='outer')
            df = df.set_index('Release Date')
            df = df.sort_index(ascending=True)
            print('fin', time.time() - self.time)
            print(df)
            df.to_csv('FinalDF.csv')


if __name__ == "__main__":
    DataEngine().final_df()
赫里斯托“离开”伊利耶夫

看起来您正在创建具有从 0 开始运行的数字索引的数据帧。当您沿列 ( axis=1)连接它们时,Pandas 会合并具有相同索引值的记录。您应该在串联之前将日期设置为索引,这将使 Pandas 有机会合并具有相同日期的记录。

这是一个简化的示例。让我们创建两个包含日期和一些值的数据框:

>>> df1 = pd.DataFrame([['2018-10-01', 3.1],['2018-10-03', 5.5]],
                       columns=['date','growth %'])
>>> df1
         date  growth %
0  2018-10-01       3.1
1  2018-10-03       5.5
>>> df2 = pd.DataFrame([['2018-10-01', 100],['2018-10-02', 200]],
                       columns=['date','items'])
>>> df2
         date  items
0  2018-10-01    100
1  2018-10-02    200

如果我们直接连接它们,Pandas 将合并具有相同索引值的记录,导致两者都有两dates列并且记录在时间轴上没有正确对齐:

>>> pd.concat([df1, df2], axis=1)
         date  growth %        date  items
0  2018-10-01       3.1  2018-10-01    100
1  2018-10-03       5.5  2018-10-02    200

这不是你想要的。

第一步是将date每个数据帧转换为日期时间对象并将其设置为索引:

>>> df1['date'] = pd.to_datetime(df1['date'])
>>> df1 = df1.set_index('date')
>>> df1
            growth %
date                
2018-10-01       3.1
2018-10-03       5.5
>>> df2['date'] = pd.to_datetime(df2['date'])
>>> df2 = df2.set_index('date')
>>> df2
            items
date             
2018-10-01    100
2018-10-02    200

连接现在按预期工作:

>>> pd.concat([df1, df2], axis=1)
            growth %  items
date                       
2018-10-01       3.1  100.0
2018-10-02       NaN  200.0
2018-10-03       5.5    NaN

您实际上并不需要将日期列转换为日期时间。它也适用于字符串:

>>> df1 = pd.DataFrame(...)
>>> df2 = pd.DataFrame(...)
>>> pd.concat([df1.set_index('date'), df2.set_index('date')], axis=1)
            growth %  items
2018-10-01       3.1  100.0
2018-10-02       NaN  200.0
2018-10-03       5.5    NaN

所需要的只是每个数据帧都按日期索引。日期时间索引虽然允许对时间序列进行切片和重新采样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将R中的两个数据框与日期合并

来自分类Dev

使用熊猫将多个数据框合并为一个

来自分类Dev

合并多个数据框的列表

来自分类Dev

Python Pandas基于多个值字段合并两个数据框

来自分类Dev

如何根据最近的日期合并两个数据框

来自分类Dev

合并两个数据框以填写缺少的日期

来自分类Dev

熊猫-根据日期将数据框拆分为多个数据框?

来自分类Dev

合并列上的多个数据框

来自分类Dev

将Python数据框拆分为多个数据框(所选行相同)

来自分类Dev

PYTHON-在日期索引上合并两个数据框

来自分类Dev

Python将数据框与日期列表进行比较,并根据结果分配字符串

来自分类Dev

将多个CSV合并到一个数据框中

来自分类Dev

通过匹配日期将2个数据框列合并为一

来自分类Dev

Python数据框列表将数据框列表合并为一个数据框

来自分类Dev

按ID和日期合并两个数据框

来自分类Dev

将多个字典合并到单个数据框

来自分类Dev

根据Python中的多个条件,将一列从多个数据框合并到另一数据框

来自分类Dev

如何将多个数据框日期列合并为R中的一个堆叠日期列

来自分类Dev

从dict合并多个数据框

来自分类Dev

如何将多个json / python字典合并到1个数据框中

来自分类Dev

使用python中的pandas将列表中的数据框合并为单个数据框

来自分类Dev

当添加某些记录字段时,将数据与日期表合并会产生奇怪的行为

来自分类Dev

Python Pandas基于多个值字段合并两个数据框

来自分类Dev

将两个数据框合并为多个值

来自分类Dev

在R中合并多个数据框

来自分类Dev

将基于三列匹配值的多个数据框合并为单个数据框

来自分类Dev

Python:具有多个标题的 CSV 文件 - 合并为一个数据框?

来自分类Dev

将基于公共索引的数据与日期合并

来自分类Dev

如何将两个数据框与重叠日期时间范围内的列合并

Related 相关文章

  1. 1

    将R中的两个数据框与日期合并

  2. 2

    使用熊猫将多个数据框合并为一个

  3. 3

    合并多个数据框的列表

  4. 4

    Python Pandas基于多个值字段合并两个数据框

  5. 5

    如何根据最近的日期合并两个数据框

  6. 6

    合并两个数据框以填写缺少的日期

  7. 7

    熊猫-根据日期将数据框拆分为多个数据框?

  8. 8

    合并列上的多个数据框

  9. 9

    将Python数据框拆分为多个数据框(所选行相同)

  10. 10

    PYTHON-在日期索引上合并两个数据框

  11. 11

    Python将数据框与日期列表进行比较,并根据结果分配字符串

  12. 12

    将多个CSV合并到一个数据框中

  13. 13

    通过匹配日期将2个数据框列合并为一

  14. 14

    Python数据框列表将数据框列表合并为一个数据框

  15. 15

    按ID和日期合并两个数据框

  16. 16

    将多个字典合并到单个数据框

  17. 17

    根据Python中的多个条件,将一列从多个数据框合并到另一数据框

  18. 18

    如何将多个数据框日期列合并为R中的一个堆叠日期列

  19. 19

    从dict合并多个数据框

  20. 20

    如何将多个json / python字典合并到1个数据框中

  21. 21

    使用python中的pandas将列表中的数据框合并为单个数据框

  22. 22

    当添加某些记录字段时,将数据与日期表合并会产生奇怪的行为

  23. 23

    Python Pandas基于多个值字段合并两个数据框

  24. 24

    将两个数据框合并为多个值

  25. 25

    在R中合并多个数据框

  26. 26

    将基于三列匹配值的多个数据框合并为单个数据框

  27. 27

    Python:具有多个标题的 CSV 文件 - 合并为一个数据框?

  28. 28

    将基于公共索引的数据与日期合并

  29. 29

    如何将两个数据框与重叠日期时间范围内的列合并

热门标签

归档