在熊猫中查找日期的最小值和最大值

时间:2020-03-08 14:36:12

标签: python pandas

嗨,我正在努力寻找数据集中日期的最大值和最小值。

下面是我的数据集:

customer_final['tran_date']

0       2014-02-28
1       2014-02-27
2       2014-02-24
3       2014-02-24
4       2014-02-23
           ...    
23048   2011-01-25
23049   2011-01-25
23050   2011-01-25
23051   2011-01-25
23052   2011-01-25

很明显,我们可以在数据集中看到2011年1月25日之间的数据 到2014-02-28。

但是执行下面提到的代码会给我错误的输出。

print(customer_final['tran_date'].max())
print(customer_final['tran_date'].min())

2014-12-02 00:00:00
2011-01-02 00:00:00

任何帮助将不胜感激。

编辑:发布原始数据。

transaction_id  cust_id tran_date   prod_subcat_code    prod_cat_code   Qty Rate    Tax total_amt   Store_type
0   80712190438 270351  28-02-2014  1   1   -5  -772    405.300 -4265.300   e-Shop
1   29258453508 270384  27-02-2014  5   3   -5  -1497   785.925 -8270.925   e-Shop
2   51750724947 273420  24-02-2014  6   5   -2  -791    166.110 -1748.110   TeleShop
3   93274880719 271509  24-02-2014  11  6   -3  -1363   429.345 -4518.345   e-Shop
4   51750724947 273420  23-02-2014  6   5   -2  -791    166.110 -1748.110   TeleShop
... ... ... ... ... ... ... ... ... ... ...
23048   94340757522 274550  25-01-2011  12  5   1   1264    132.720 1396.720    e-Shop
23049   89780862956 270022  25-01-2011  4   1   1   677 71.085  748.085 e-Shop
23050   85115299378 271020  25-01-2011  2   6   4   1052    441.840 4649.840    MBR
23051   72870271171 270911  25-01-2011  11  5   3   1142    359.730 3785.730    TeleShop
23052   77960931771 271961  25-01-2011  11  5   1   447 46.935  493.935 TeleShop

编辑2:DF中所有列的数据类型。

transaction_id               int64
cust_id                      int64
tran_date           datetime64[ns]
prod_subcat_code             int64
prod_cat_code                int64
Qty                          int64
Rate                         int64
Tax                        float64
total_amt                  float64
Store_type                  object
Unnamed: 10                 object
dtype: object

2 个答案:

答案 0 :(得分:0)

显然,您的日期(在输入文件中)的格式为 各种方式。

您的评论之一包含Timestamp('2014-12-02 00:00:00'), 所以我看到您使用的是%Y-%m-%d 格式(可能在大多数情况下), 但是您在另一个地方写了time data '12/2/2014',所以至少 在某些行中,您具有%d /%m /%Y 格式。

将您的输入排序。您不能将日期格式设置为2 不同的格式。

编辑

我执行了以下实验:

作为源数据,我使用了部分原始数据(前2行和后2行), 并使用其他日期格式的其他行(第3行) 存储为字符串变量:

  transaction_id cust_id tran_date prod_subcat_code prod_cat_code Qty Rate Tax total_amt Store_type
3       93274880719 271509  24-02-2014  11  6   -3  -1363   429.345 -4518.345   e-Shop
4       51750724947 273420  23-02-2014  6   5   -2  -791    166.110 -1748.110   TeleShop
40      51750724947 273420  12/2/2014   6   5   -2  -791    166.110 -1748.110   TeleShop
23048   94340757522 274550  25-01-2011  12  5   1   1264    132.720 1396.720    e-Shop
23049   89780862956 270022  25-01-2011  4   1   1   677     71.085  748.085     e-Shop'''

请注意,第一行的开头有一些空格,以提供 索引列的空列名称。

然后,我定义了以下日期解析函数(需要import re), 即将使用:

def dPars(txt):
    if re.match(r'\d{2}-\d{1,2}-\d{4}', txt):
        return pd.to_datetime(txt, format='%d-%m-%Y')
    if re.match(r'\d{2}/\d{1,2}/\d{4}', txt):
        return pd.to_datetime(txt, format='%d/%m/%Y')
    return txt

我阅读了上面的内容,并使用了上面的日期转换器功能:

customer_final = pd.read_csv(io.StringIO(txt), delim_whitespace=True,
    index_col=0, parse_dates=['tran_date'], date_parser=dPars)

我打印了 tran_date 列-print(customer_final.tran_date)-获取

3       2014-02-24
4       2014-02-23
40      2014-02-12
23048   2011-01-25
23049   2011-01-25
Name: tran_date, dtype: datetime64[ns]

因此所有日期均已按原样进行解析。

我打印了最小/最大日期-print(customer_final['tran_date'].min(), customer_final['tran_date'].max())-得到正确的结果:

2011-01-25 00:00:00 2014-02-24 00:00:00

也许您应该基于我的实验编写代码(将代码替换为 io.StringIO(txt)和您输入的文件名)。

还请注意,如果您有一些输入行的格式为12/2/2014,则 12 月份数字,而 2 day 数字(美国日期格式), 而其他行的日期优先。

答案 1 :(得分:0)

从根本上讲,您有两个问题:1)查看缩写数据和2)查看未排序的数据。

您声明:很明显,我们可以从数据集中看到2011年1月25日至2014年2月28日之间的数据。但是,Pandas缩写了您的 未排序 数据,在23k行数据框中删除很多行,并用省略号...。因此,这种对日期的手动检查仅来自与minmax值不匹配的无序数据的头和尾。

customer_final['tran_date']

# 0       2014-02-28       # <---- HEAD OF UNSORTED DATA
# 1       2014-02-27
# 2       2014-02-24
# 3       2014-02-24
# 4       2014-02-23
#            ...           # <---- OMITTED VALUES OF UNSORTED DATA 
# 23048   2011-01-25
# 23049   2011-01-25
# 23050   2011-01-25
# 23051   2011-01-25
# 23052   2011-01-25       # <---- TAIL OF UNSORTED DATA

您可以使用pd.set_option('display.max_rows', None)删除行的遗漏,但您可能不知所措,无法显示23k +的未排序值。

因此,那些minmax并没有错。要仔细检查,请对数据进行实际排序,然后打印出列或列的首尾。这样做,总计数字应相应匹配。

# SORT DATA FRAME IN DESCENDING ORDER BY tran_date
customer_final = customer_final.sort_values(by='tran_date', ascending = False)

# VIEW ALL DATA (ABBREVIATED UNLESS YOU CHANGE SETTING)
customer_final['tran_date']

# VIEW FIRST VALUES (DEFAULT TO 5)
customer_final['tran_date'].head(5)

# VIEW LAST VALUES (DEFAULT TO 5)
customer_final['tran_date'].tail(5)
相关问题