Python 在Pandas中查找日期列的最小值和最大值
嗨,我正在努力在我的数据集中找到日期的最大值和最小值列 以下是我的数据集:Python 在Pandas中查找日期列的最小值和最大值,python,pandas,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
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
显然,您的日期(在输入文件中)是用 各种方式 您的一条评论包含时间戳('2014-12-02 00:00:00'), 所以我看到您有%Y-%m-%d格式(可能在大多数情况下), 但在另一个地方,您已经编写了时间数据“2014年12月2日”,所以至少 在某些行中,您有%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
required),
即将使用:
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列-打印(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]
因此,所有日期都已按应有的方式解析
我打印了最小/最大日期-打印(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是日号(美国日期格式),
而其他行则先有天数。基本上,您有两个问题:1)查看缩写数据和2)查看未排序数据 您声称:正如我们在数据集中清楚地看到的,我们有2011-01-25到2014-02-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
你试过这个吗?您的栏目类型是datetime吗?是的,先生!但是运气不好。请尝试获取
customer\u final['tran\u date'].max()。dt.day
在最大位置,查看您的日期时间类型是否正确。@coc018是的,它的数据类型是datetime64[ns]
我尝试了不同的日期格式,以检查数据集中是否存在任何问题。如果原始字段已经是datetime as,则不能使用格式,因为此类型不允许使用混合类型。OP很可能只是没有对数据进行排序。
# 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)