如何对日期时间索引数据框进行排序
Posted
技术标签:
【中文标题】如何对日期时间索引数据框进行排序【英文标题】:How to sort datetime index dataframe 【发布时间】:2021-07-22 22:53:18 【问题描述】:我有一个日期时间索引数据框,其中包含 2019 年至 2020 年之间每小时的数据,我从 CSV 文件导入如下,以便仅保留我想要的列,名称更简单(名称因工作原因而更改) :
file = 'data.csv'
df = pd.read_csv(file,sep=";", header=0, na_values=['NA', ' ' , '.'])
df['datetime']=pd.to_datetime(df['datetime'])
df['week'] = df['datetime'].dt.isocalendar().week
df['month'] = df['datetime'].dt.month
df['hour']=df['datetime'].dt.hour
df['day']=df['datetime'].dt.day
df=df.set_index(['datetime'])
df=df.rename(columns='data1':'d1','data2':'d2','data3':'d3','data4':'d4','data5':'d5','data6':'d6','data7':'d7','data8':'d8','data9':'d9','data10':'d10','data11':'d11','data12':'d12','data13':'d13','data14':'d14','data15':'d15','data16':'d16')
df=df[['d1','d2','d3','d4','d5','d6','d7','d8','d9','d10','d11','d12','d13','d14','d15','d16','week','month','hour','day']]
当我打字时:
df['d4'][0:2800].min()
答案是 995,我知道这是一个很好的答案,因为我检查了 CSV 文件。
现在我的问题是,在导入过程中,一些日期以错误的顺序放入数据框中。我不知道为什么,但例如 2019-09-09 后面会跟着 2019-09-13 而不是 2019-09-10 。
我试图通过使用来修复它
df=df.sort_index(ascending=True)
或
df=df.sort_index()
现在似乎所有日期都井井有条,但现在我输入了
df['d4'][0:2800].min()
现在的答案是 870,这是一个错误的值。
似乎 df.sort_index() 正在混合我的数据,我做错了什么吗?
【问题讨论】:
在调用pd.to_datetime(df['datetime'])
之前df['datetime']
的输入格式是什么?
你好,是字符串形式是'01/01/2019 00:00'
那么,什么是第一个,天还是月?
好的,这很重要;你能把你的代码改成df['datetime']=pd.to_datetime(df['datetime'], dayfirst=True)
看看有没有帮助?
非常感谢!不敢相信我没想到...谢谢!
【参考方案1】:
这里的重点是确保将日期/时间正确导入到日期时间数据类型。像'01/01/2019 00:00'
这样的字符串默认会被解析为mm/dd/YYYY HH:MM
,见pandas.to_datetime:
dayfirst 布尔型,默认为 False
根据您居住的地方,您可能会认为这一天是第一位的。
还要注意,这是针对每个元素进行评估的;例如'25-12-2019'
被解析为 12 月 25 日,因为没有第 25 个月。但是同一列中的'03-12-2019'
变成了 3 月 12 日,尽管可能预计会出现 12 月 3 日。这会造成相当混乱。所以如果...
日期在您的日期字符串中排在第一位:
df['datetime'] = pd.to_datetime(df['datetime'], dayfirst=True)
你也可以
通过format
kwarg 的to_datetime
明确提供parsing directive
通过pandas.read_csv 的parse_dates
kwarg 指定要解析为日期时间的列。在那里,您还可以指定dayfirst=True
【讨论】:
以上是关于如何对日期时间索引数据框进行排序的主要内容,如果未能解决你的问题,请参考以下文章