【问题标题】:How do I properly set the Datetimeindex for a Pandas datetime object in a dataframe?如何在数据框中为 Pandas 日期时间对象正确设置 Datetimeindex?
【发布时间】: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”格式。

标签: python datetime pandas


【解决方案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'] 视为整数列。

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2011-07-07
      • 2020-03-14
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      相关资源
      最近更新 更多