【问题标题】:Pandas DataFrame - Combine Date column headers with Time rowsPandas DataFrame - 将日期列标题与时间行结合起来
【发布时间】:2020-11-16 11:24:30
【问题描述】:

我有以下数据通过read_excel 方法进入数据框:

                 Time  ...  2020-04-05 00:00:00
0 1900-01-01 00:00:00  ...                    4
1 1900-01-01 00:05:00  ...                    1
2 1900-01-01 00:10:00  ...                    1

我想合并列标题日期和行时间,这样看起来更像:

                 Time  ...   value
0 2020-04-05 00:00:00  ...       4
1 2020-04-05 00:05:00  ...       1
2 2020-04-05 00:10:00  ...       1

我已经尝试了this questionthis question 的答案,但他们的做法与我相反(带有日期行的时间列),我想我正在为我的问题在某处调整代码。 根据上面的 Q1,我通过交换 timedelta 和 todates 行尝试了以下操作,因为列是我的日期,行是我的时间:

data.Time = pd.to_timedelta(data.Time.astype(str) + ':00', unit='h')
data = data.set_index('Time')
data.columns = pd.to_datetime(data.Time)
data = data.stack()
data.index = data.index.get_level_values(0) + data.index.get_level_values(1)
data = data.reset_index()
data.columns = ['date', 'val']

我在第一行收到错误 ValueError: unit must not be specified if the input contains a str 让我感到困惑,因为我确实指定了单位类型。 我觉得这就是答案,我已经接近了,我只是错过了一些东西,我无法弄清楚 - 如何将我的日期列与我的时间行结合起来?

使用的数据类型:Time = datetime64[ns], 2019-12-02 00:00:00 (etc.) = int64

编辑:误读错误并认为它表示该单元丢失。我删除了该单元,但收到了另一个错误 ValueError: only leading negative signs are allowed

【问题讨论】:

  • inout 数据的print (df.columns) 和输入数据的print (df.Time.head(3)) 是什么?
  • 列是:Index(['Time', 2019-12-02 00:00:00, 2019-12-03 00:00:00, 2019-12-04 00:00:00, 2019-12-05 00:00:00]) 和 Time .head = 0 1900-01-01 00:00:00 1 1900-01-01 00:05:00 2 1900-01-01 00:10:00 Name: Time, dtype: datetime64[ns]
  • 谢谢,答案已编辑,你能测试一下吗?

标签: python pandas date datetime


【解决方案1】:

我认为您的解决方案很接近,只需要重新评估转换为日期时间的列名,然后将 unit='h'to_timedelta 中删除,并将日期时间转换为 HH:MM:SS 字符串:

np.random.seed(102)
c = ['Time', '2019-12-02 00:00:00', '2019-12-03 00:00:00', 
             '2019-12-04 00:00:00', '2019-12-05 00:00:00']
t = pd.to_datetime(['1900-01-01 00:00:00', '1900-01-01 00:05:00', '1900-01-01 00:10:00'])

data=pd.DataFrame(np.random.randint(10, size=(len(t), len(c))), columns=c)
data['Time'] = t

print (data)
                 Time  2019-12-02 00:00:00  2019-12-03 00:00:00  \
0 1900-01-01 00:00:00                    3                    2   
1 1900-01-01 00:05:00                    8                    8   
2 1900-01-01 00:10:00                    7                    0   

   2019-12-04 00:00:00  2019-12-05 00:00:00  
0                    2                    2  
1                    9                    7  
2                    6                    2  

print (data.columns)
Index(['Time', '2019-12-02 00:00:00', '2019-12-03 00:00:00',
       '2019-12-04 00:00:00', '2019-12-05 00:00:00'],
      dtype='object')

print (data['Time'])
0   1900-01-01 00:00:00
1   1900-01-01 00:05:00
2   1900-01-01 00:10:00
Name: Time, dtype: datetime64[ns]

data.Time = pd.to_timedelta(data.Time.dt.strftime('%H:%M:%S'))

data = data.set_index('Time')
#convert data.columns to datetimes and assign back
data.columns = pd.to_datetime(data.columns)
data = data.stack()
data.index = data.index.get_level_values(0) + data.index.get_level_values(1)
data = data.sort_index().reset_index()
data.columns = ['date', 'val']

print (data)
                  date  val
0  2019-12-02 00:00:00    3
1  2019-12-02 00:05:00    8
2  2019-12-02 00:10:00    7
3  2019-12-03 00:00:00    2
4  2019-12-03 00:05:00    8
5  2019-12-03 00:10:00    0
6  2019-12-04 00:00:00    2
7  2019-12-04 00:05:00    9
8  2019-12-04 00:10:00    6
9  2019-12-05 00:00:00    2
10 2019-12-05 00:05:00    7
11 2019-12-05 00:10:00    2

或者:

df = data.melt('Time', var_name='Date', value_name='val')
df['Date'] = (pd.to_datetime(df['Date']) +  
                  pd.to_timedelta(df.pop('Time').dt.strftime('%H:%M:%S')))
df = df.sort_values('Date', ignore_index=True)
print (df)
                  Date  val
0  2019-12-02 00:00:00    3
1  2019-12-02 00:05:00    8
2  2019-12-02 00:10:00    7
3  2019-12-03 00:00:00    2
4  2019-12-03 00:05:00    8
5  2019-12-03 00:10:00    0
6  2019-12-04 00:00:00    2
7  2019-12-04 00:05:00    9
8  2019-12-04 00:10:00    6
9  2019-12-05 00:00:00    2
10 2019-12-05 00:05:00    7
11 2019-12-05 00:10:00    2
    

【讨论】:

  • 感谢您抽出宝贵时间回复-我尝试了第一个并收到了ValueError: only leading negative signs are allowed 第二个建议也导致了错误dateutil.parser._parser.ParserError: Unknown string format: 1900-01-01 00:00:00 2019-12-02 00:00:00 这是我试图合并日期的问题吗一个日期时间字段与另一个日期时间字段的时间部分?
  • 啊,这太接近了!它只是缺少时间部分。堆栈结合了 0 天和日期部分 - 这可能与索引级别有关吗?:堆栈前:Time 2019-12-02 ...... 0 days 00:00:00 ...... 7 堆栈后:Time ...... 0 days 2019-12-02 ...... 7
  • @Jiggs - 添加了您在问题 cmets 中提到的示例数据,对我来说工作完美。
  • @Jiggs - 为相同的数据添加了 print (data.columns)print (data['Time'])
  • 谢谢!我错过了 sort_index() 调用。一切都很好,工作正常。我整个周末都在努力解决这个问题,非常感谢!
猜你喜欢
  • 2017-05-16
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
相关资源
最近更新 更多