如何在数据框中为 Pandas 日期时间对象正确设置 Datetimeindex?

Posted

技术标签:

【中文标题】如何在数据框中为 Pandas 日期时间对象正确设置 Datetimeindex?【英文标题】:How do I properly set the Datetimeindex for a Pandas datetime object in a dataframe? 【发布时间】:2015-01-17 20:51:13 【问题描述】:

我有一个熊猫数据框:

    lat         lng         alt days              date        time
0   40.003834   116.321462  211 39745.175405      2008-10-24  04:12:35
1   40.003783   116.321431  201 39745.175463  2008-10-24      04:12:40
2   40.003690   116.321429  203 39745.175521      2008-10-24      04:12:45
3   40.003589   116.321427  194 39745.175579      2008-10-24      04:12:50
4   40.003522   116.321412  190 39745.175637      2008-10-24      04:12:55
5   40.003509   116.321484  188 39745.175694      2008-10-24      04:13:00

为此,我尝试将 df['date'] 和 df['time'] 列转换为日期时间。我能做到:

df['Datetime'] = pd.to_datetime(df['date']+df['time'])
df = df.set_index(['Datetime'])
del df['date']
del df['time']

我得到:

                    lat         lng         alt days
Datetime                            
2008-10-2404:12:35  40.003834   116.321462  211 39745.175405    
2008-10-2404:12:40  40.003783   116.321431  201 39745.175463
2008-10-2404:12:45  40.003690   116.321429  203 39745.175521    
2008-10-2404:12:50  40.003589   116.321427  194 39745.175579    
2008-10-2404:12:55  40.003522   116.321412  190 39745.175637

但是如果我尝试:

df.between_time(time(1),time(22,59,59))['lng'].std()

我收到一个错误 - 'TypeError: Index must be DatetimeIndex'

所以,我也尝试过设置 DatetimeIndex:

df['Datetime'] = pd.to_datetime(df['date']+df['time'])
#df = df.set_index(['Datetime'])
df = df.set_index(pd.DatetimeIndex(df['Datetime']))
del df['date']
del df['time']

这也会引发错误 - 'DateParseError: unknown string format'

如何正确创建 datetime 列和 DatetimeIndex 以便 df.between_time() 正常工作?

【问题讨论】:

“DateParseError: unknown string format”是因为“DD”和“HH”相邻,所以无法识别“2008-10-2404:12:35”格式。 【参考方案1】:

您没有正确创建日期时间索引,

format = '%Y-%m-%d %H:%M:%S'
df['Datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'], format=format)
df = df.set_index(pd.DatetimeIndex(df['Datetime']))

【讨论】:

【参考方案2】:

为了简化Kirubaharan's answer:

df['Datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'])
df = df.set_index('Datetime')

并删除不需要的列(正如 OP 所做的但未在问题中指定本身):

df = df.drop(['date','time'], axis=1)

【讨论】:

所以这里的技巧是在日期和时间之间添加一个空格,然后 pd.to_datetime() 使用结果字符串做正确的事情吗?【参考方案3】:

这对我来说效果最好:

format = '%Y-%m-%d%H:%M:%S'
df['Datetime'] = pd.to_datetime(df['date'] + df['time'].astype("string"), format=format)

在某些情况下,Python 将 df['date'] 视为整数列。

【讨论】:

以上是关于如何在数据框中为 Pandas 日期时间对象正确设置 Datetimeindex?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas 将数据框中的 Python 对象列转换为没有日期的时间

如何在 Pandas 数据框中按行值对日期时间列进行排序?

Pandas:如何在数据透视表数据框中仅添加最新日期

如何使用另一个日期时间索引获取具有日期时间索引的 Pandas 数据框中的行?

如何将数据框中的多列合并为 Pandas 日期时间格式

如何在 pandas 的数据框中选择多个日期列,然后将它们全部格式化? (Python)