【问题标题】:Comparing the amount of day in python with Pandas from a CSV file将 python 中的天数与 CSV 文件中的 Pandas 进行比较
【发布时间】:2017-11-10 20:04:53
【问题描述】:

所以我有一个大的 CSV 文件,我想从中选择某个列,从中读取日期并将它们与今天进行比较。我阅读了 Pandas 文档,并使用 to_datetime 将列转换为日期时间格式,但出现运行时错误“AttributeError: 'Series' object has no attribute 'days'' 是我转换日期的整个逻辑有缺陷还是我只是滥用to_datetime。到目前为止,这是我的代码:

`df = pd.read_csv('roadData.csv',delimiter = ';',encoding = "latin1",error_bad_lines=False)
thisDate = datetime.date.today()
correctCars.dateRegistered = correctCars.dateRegistered.apply(str)
paivat = pd.to_datetime(correctCars.dateRegistered, errors='coerce')
fiveYears = paivat[(paivat.days - thisDate.days >= 0) & (paivat.days - thisDate.days <= 1825)]
print(fiveYears.count())
`

【问题讨论】:

  • 另外,您可以在读取 CSV 时转换为日期时间。调用read_csv时使用parse_dates='ensirekisterointipvm'
  • 注意:使用days 适用于timedelta 对象,不适用于datetime 对象。

标签: python pandas csv


【解决方案1】:

如果可能有大数据,请使用参数usecols 仅过滤某些列并过滤between

paivat = pd.read_csv('roadData.csv',
                     sep = ';',
                     encoding = "latin1",
                     error_bad_lines=False, 
                     usecols=['dateRegistered'],
                     parse_dates=['dateRegistered'])

#if parse_dates doesnt return datetimes
#paivat = pd.to_datetime(paivat.dateRegistered, errors='coerce')

#for compare need datetime
thisDate = datetime.datetime.now()

#get days
d = (paivat.dateRegistered - thisDate).dt.days
#filtering
fiveYears = paivat[d.between(0, 1825)]

或者:

fiveYears = paivat[(d >= 0) & (d <= 1825)]

如果只需要计数:

print (d.between(0, 1825).sum())

或者:

print (((d >= 0) & (d <= 1825)).sum())

示例:

import pandas as pd
import numpy as np
from pandas.compat import StringIO
import datetime

temp=u"""dateRegistered;col
2017-11-25;0
2017-12-26;1
2017-12-27;2
2017-11-28;3
2017-11-29;4
2017-11-30;5
2017-11-01;7
2017-11-02;8
2017-11-03;9"""
#after testing replace 'StringIO(temp)' to 'roadData.csv'
paivat = pd.read_csv(StringIO(temp),
                     sep = ';',
                     encoding = "latin1",
                     error_bad_lines=False, 
                     usecols=['dateRegistered'],
                     parse_dates=['dateRegistered'])

thisDate = datetime.datetime.now()

d = (paivat.dateRegistered - thisDate).dt.days
print (d)
0    14
1    45
2    46
3    17
4    18
5    19
6   -10
7    -9
8    -8
Name: dateRegistered, dtype: int64

print (d.between(0, 15).sum())
1

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多