Python 计算数据集中存在多少不同的日期

Python 计算数据集中存在多少不同的日期,python,pandas,Python,Pandas,我有一个csv数据集,它有许多unix时间戳以及一些坐标: "2018-07-13 14:04:53",20.61467382,-100.40038540 "2018-07-13 14:04:53",20.61507289,-100.40076548 "2018-07-13 14:04:53",20.61516937,-100.40073449 "2018-07-13 15:01:25",20.61535620,-100.40057307 "2018-07-13 15:01:25",20.599

我有一个csv数据集,它有许多unix时间戳以及一些坐标:

"2018-07-13 14:04:53",20.61467382,-100.40038540
"2018-07-13 14:04:53",20.61507289,-100.40076548
"2018-07-13 14:04:53",20.61516937,-100.40073449
"2018-07-13 15:01:25",20.61535620,-100.40057307
"2018-07-13 15:01:25",20.59975566,-100.37821134
"2018-07-14 12:55:13",20.59858772,-100.37838086
"2018-07-14 13:08:06",20.59864831,-100.37822228
"2018-07-14 21:51:54",20.59862009,-100.37835681
"2018-07-15 11:53:47",20.59875168,-100.37830434
"2018-07-15 12:02:01",20.59861465,-100.37837653
我想数一数出现的不同日期的数量。我怎样才能做到这一点?
在这种情况下,对于这个数据集,我的循环的正确结果是3。7月13日、14日和15日。我猜我必须使用pandas按天订购它?

假设列是datetime列

df.iloc[:, 0].dt.normalize().nunique()

3
只是想确定一下

pd.to_datetime(df.iloc[:, 0]).dt.normalize().nunique()

3
dt
是日期时间访问器,允许您获取日期时间的日期部分的
date
属性。然后,
nunique
通过获取唯一值的数量来完成作业



根据@root的建议编辑
dt.normalize()
而不是
dt.date

假设列是datetime列

df.iloc[:, 0].dt.normalize().nunique()

3
只是想确定一下

pd.to_datetime(df.iloc[:, 0]).dt.normalize().nunique()

3
dt
是日期时间访问器,允许您获取日期时间的日期部分的
date
属性。然后,
nunique
通过获取唯一值的数量来完成作业


根据@root的建议编辑
dt.normalize()
而不是
dt.date
使用哈希集

import csv

with open('dates.csv', 'rb') as csvfile:
    data = list(csv.reader(csvfile))

unique_dates = set()
for row in data:
    date = row[0].split()[0]
    unique_dates.add(date)

print 'We have {} unique dates !'.format(len(unique_dates))
使用哈希集

import csv

with open('dates.csv', 'rb') as csvfile:
    data = list(csv.reader(csvfile))

unique_dates = set()
for row in data:
    date = row[0].split()[0]
    unique_dates.add(date)

print 'We have {} unique dates !'.format(len(unique_dates))

无需使用
DataFrame
s就可以获得相同的结果的一种方法是在阅读
csv
文件后使用
datetimes
set
理解

In [18]: import csv

In [19]: import datetime

In [21]: with open('dates.csv') as csvfile:
    ...:     data = list(csv.reader(csvfile))

In [22]: {datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S').date() for row in data)}
Out[22]:
{datetime.date(2018, 7, 13),
 datetime.date(2018, 7, 14),
 datetime.date(2018, 7, 15)}

无需使用
DataFrame
s就可以获得相同的结果的一种方法是在阅读
csv
文件后使用
datetimes
set
理解

In [18]: import csv

In [19]: import datetime

In [21]: with open('dates.csv') as csvfile:
    ...:     data = list(csv.reader(csvfile))

In [22]: {datetime.datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S').date() for row in data)}
Out[22]:
{datetime.date(2018, 7, 13),
 datetime.date(2018, 7, 14),
 datetime.date(2018, 7, 15)}

使用
.dt.normalize()
交换
.dt.date
可能会更有效,因为它不会强制转换类型(即
时间戳
-->
日期时间.date
)。感谢@rootswapping
.dt.date
.dt.normalize()
可能会更有效,因为它不会强制转换类型(即
时间戳-->
日期时间.date
),这很有用。谢谢@rootOverkill是相对的。如果您的CSV文件有一百万行,则此解决方案需要10秒才能完成,而如果您使用pandas,则需要半秒。过度杀戮是相对的。如果您的CSV文件有一百万行,则完成此解决方案需要10秒,而使用pandas则需要半秒。