【问题标题】:Finding min and max of date column in Pandas在 Pandas 中查找日期列的最小值和最大值
【发布时间】:2020-06-20 15:14:44
【问题描述】:

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

下面是我的数据集:

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-01-25 之间的数据 至 2014 年 2 月 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

【问题讨论】:

  • 你的列是日期时间类型的吗?
  • 是的,先生!但没有运气。
  • 尝试在最大位置获取customer_final['tran_date'].max(). dt.day,看看你的日期时间类型是否正确。
  • @coc018 是的,它的 dtype 是 datetime64[ns]

标签: python pandas


【解决方案1】:

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

您的一个 cmets 包含 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,那么 12month 数字,2day 数字(美国日期格式), 而其他行首先显示日期。

【讨论】:

  • 我尝试了不同的日期格式来检查数据集中是否存在任何问题。
  • 如果原始字段已经是 OP comments 的日期时间,则格式不会成为问题,因为此类型不允许混合类型。很可能 OP 根本没有对数据进行排序。
【解决方案2】:

基本上,您有两个问题: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)

【讨论】:

    猜你喜欢
    • 2017-11-02
    • 2021-12-15
    • 2015-06-29
    • 1970-01-01
    • 2020-08-29
    • 2020-09-19
    • 2017-09-19
    • 2022-06-16
    相关资源
    最近更新 更多