【问题标题】:Pandas read csv dataframe rows from specific date and time rangePandas 从特定日期和时间范围读取 csv 数据帧行
【发布时间】:2017-12-21 19:18:31
【问题描述】:

我有一个来自 CSV 文件的数据框,如下所示,

         TimeStamp
0        12/7/2017 8:00
1        12/7/2017 7:00
2        12/7/2017 6:00
3        12/7/2017 5:00
4        12/7/2017 4:00
5        12/7/2017 3:00
6        12/7/2017 2:00
7        12/7/2017 1:00
8        12/7/2017 0:00
9       11/7/2017 23:00
10      11/7/2017 22:00
...
9996     3/12/2015 6:00
9997     3/12/2015 5:00
9998     3/12/2015 4:00
9999     3/12/2015 3:00
Name: TimeStamp, Length: 10000, dtype: object

我正在尝试使用Pandas 读取特定日期和时间范围内的数据,例如从11/7/2017 8:0012/7/2017 8:00

我尝试过使用 Boolean maskDatetimeIndex.Between 方法,它读取的数据超出了该范围以及 2016 年和 2015 年的数据。这是我的代码,

import pandas as pd

eurusd = pd.read_csv('fxhistoricaldata_EURUSD_hour.csv')
eurusd = eurusd[(eurusd['TimeStamp'] >= '11/7/2017 8:00') & 
(eurusd['TimeStamp'] <= '12/7/2017 8:00')]

print(eurusd['TimeStamp'])

或使用.between,

eurusd = eurusd[eurusd['TimeStamp'].between('11/7/2017 8:00', '12/7/2017 8:00')]

结果是这样的,

2        12/7/2017 6:00
3        12/7/2017 5:00
4        12/7/2017 4:00
5        12/7/2017 3:00
6        12/7/2017 2:00
7        12/7/2017 1:00
8        12/7/2017 0:00
23       11/7/2017 9:00
24       11/7/2017 8:00
513     12/6/2017 23:00
514     12/6/2017 22:00
515     12/6/2017 21:00
516     12/6/2017 20:00
517     12/6/2017 19:00
518     12/6/2017 18:00
519     12/6/2017 17:00
520     12/6/2017 16:00
521     12/6/2017 15:00
522     12/6/2017 14:00
523     12/6/2017 13:00
524     12/6/2017 12:00
525     12/6/2017 11:00
         ...       
8827     12/2/2016 5:00
8828     12/2/2016 4:00
8829     12/2/2016 3:00
Name: TimeStamp, Length: 305, dtype: object

谁能帮我解决我的问题,或者有什么功能可以帮助我完成任务?非常感谢任何帮助!

【问题讨论】:

  • 转换时间戳列,如eurusd['Timestamp'] = pd.to_datetime(eurusd['Timestamp']),您的解决方案将起作用。
  • 或对 read_csv 使用 parse_dates=True

标签: python python-3.x csv pandas


【解决方案1】:

您可以使用 datetime 和 dateutil 库来做到这一点:

from dateutil import parser
from datetime import datetime

df['TimeStamp'] = df['TimeStamp'].apply(lambda x: parser.parse(x))

df[(df['TimeStamp'] < datetime(2017, 12, 7)) & (df['TimeStamp']> datetime(2015, 3, 12))] #or whichever dates you're looking for

【讨论】:

    【解决方案2】:

    您需要确保eurusd['TimeStamp'] 是一个dtype 为datetime64[ns] 的系列:

    eurusd['TimeStamp'] = pd.to_datetime(eurusd['TimeStamp'])
    

    创建一个布尔掩码:

    mask = (eurusd['TimeStamp'] > start_date) & (eurusd['TimeStamp'] <= end_date)
    

    现在,重新分配(或任何您想对输出执行的操作):

    eurusd = eurusd.loc[mask]
    

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多