嗨,我正在努力寻找数据集中日期的最大值和最小值。
下面是我的数据集:
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
答案 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行数据框中删除很多行,并用省略号...
。因此,这种对日期的手动检查仅来自与min
和max
值不匹配的无序数据的头和尾。
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 +的未排序值。
因此,那些min
和max
并没有错。要仔细检查,请对数据进行实际排序,然后打印出列或列的首尾。这样做,总计数字应相应匹配。
# 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)