【问题标题】:Import historical Metatrader CSV data to Python with Pandas library (date/time parsing)使用 Pandas 库将历史 Metatrader CSV 数据导入 Python(日期/时间解析)
【发布时间】:2012-07-25 06:50:18
【问题描述】:

我有一些 CSV 数据,例如

2011.12.08,22:45,1.33434,1.33465,1.33415,1.33419,265
2011.12.08,23:00,1.33419,1.33542,1.33419,1.33472,391
2011.12.08,23:15,1.33470,1.33483,1.33383,1.33411,420
2011.12.08,23:30,1.33413,1.33451,1.33389,1.33400,285

来自 Metatrader 4 的名为 EURUSD15.csv 的文件

我想通过 Python 使用 Pandas 库和 read_csv 函数导入这个文件...

所以我这样做了:

#!/usr/bin/env python
from pandas import *
df = read_csv('data/EURUSD15.csv', header=None)
df.columns = ['Date', 'Time', 'Open', 'High', 'Low', 'Close', 'Volume']
print(df)

我现在想解析日期/时间...

所以我改变了

df = read_csv('data/EURUSD15.csv', header=None)

df = read_csv('data/EURUSD15.csv', header=None, parse_dates=[[1, 2]])

但我收到此错误消息

Exception: Length mismatch (7 vs 6)

如何解析日期和时间列并将 2 列视为 1 个“日期时间”列。

【问题讨论】:

    标签: python parsing csv pandas metatrader4


    【解决方案1】:

    列的索引为零,因此您需要执行 parse_dates=[[0,1]]
    这是最新版本的熊猫,但应该适用于 0.8.0+:

    In [74]: data = """\
    2011.12.08,22:45,1.33434,1.33465,1.33415,1.33419,265
    2011.12.08,23:00,1.33419,1.33542,1.33419,1.33472,391
    2011.12.08,23:15,1.33470,1.33483,1.33383,1.33411,420
    2011.12.08,23:30,1.33413,1.33451,1.33389,1.33400,285
    """
    
    In [75]: pd.read_csv(StringIO(data), 
                         names=['Date', 'Time', 'Open', 'High', 'Low', 'Close', 'Volume'], 
                         index_col='Date_Time', parse_dates=[[0, 1]])
    Out[75]: 
                            Open     High      Low    Close  Volume
    Date_Time                                                      
    2011-12-08 22:45:00  1.33434  1.33465  1.33415  1.33419     265
    2011-12-08 23:00:00  1.33419  1.33542  1.33419  1.33472     391
    2011-12-08 23:15:00  1.33470  1.33483  1.33383  1.33411     420
    2011-12-08 23:30:00  1.33413  1.33451  1.33389  1.33400     285
    

    注意index_col=0 也可以使用。复杂的日期解析会在结果列之前添加,因此 parse_dates 将引用处理日期前的列索引(即,0 是日期,1 是时间),index_col 是指处理日期后的列索引。因此,建议使用列名,因为这样您就不必考虑处理前后的列索引。

    【讨论】:

    • 非常感谢!它对我有很大帮助!
    【解决方案2】:

    parse_dates 不采用索引值。

    尝试类似:

    pd.read_csv('data/EURUSD15.csv',  parse_dates = [['YYYY.MM.DD', 'HH:MM']], index_col = 0, 
            date_parser=parse)
    

    【讨论】:

    • 对不起,它不起作用! df = read_csv('data/EURUSD15.csv', header=None, parse_dates=[0]) 适用于第一列,df = read_csv('data/EURUSD15.csv', header=None, parse_dates=[1])适用于第二列但不适用于 df = read_csv('data/EURUSD15.csv', header=None, parse_dates=[[0, 1]])
    • 当我尝试你的代码时 df = read_csv('data/EURUSD15.csv', header=None, parse_dates = [['YYYY.MM.DD', 'HH:MM']], index_col = 0, date_parser=parse) 我收到此错误消息 NameError: name 'parse' is not defined 所以我尝试了 df = read_csv('data/EURUSD15.csv', header=None, parse_dates = [['YYYY.MM.DD ', 'HH:MM']], index_col = 0, date_parser=True) 并得到此错误消息 ValueError: could not broadcast input array from shape (15719) into shape (0)
    【解决方案3】:
    parse = lambda x: datetime.strptime(x, '%d-%m-%Y %H:%M')
    df = pd.read_csv('data/EURUSD15.csv', parse_dates=[[0, 1]], date_parser=parse, index_col=[0],   header=None)
    keys = ['Open', 'High', 'Low', 'Close','Volume']
    df.columns = [x for x in keys]
    

    【讨论】:

    • 如果您可以为您的答案添加一些解释,它会改进很多!
    【解决方案4】:

    更简单的方法是使用名为pytrader的拖放解决方案,请在github上查看。

    【讨论】:

    • 请使用 pytrader 包含 MWE。
    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 2012-09-04
    • 2018-06-20
    • 2021-09-03
    • 2015-09-01
    • 2019-06-29
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多