【问题标题】:Column Manipulations with date-Time Pandas使用日期时间 Pandas 进行列操作
【发布时间】:2015-09-14 17:37:08
【问题描述】:

我正在尝试同时对行和列进行一些列操作,包括 Pandas 中的日期和时间序列。传统上没有系列的 python 字典很棒。但是有了 Pandas 对我来说是一件新鲜事。

输入文件:N 个。

File1.csv, File2.csv, File3.csv, ........... Filen.csv 

Ids,Date-time-1    Ids,Date-time-2  Ids,Date-time-1
56,4568          645,5545         25,54165
45,464           458,546        

我正在尝试将所有文​​件的Date-time 列合并到一个关于Ids 的大数据文件中

Ids,Date-time-ref,Date-time-1,date-time-2
56,100,4468,NAN
45,150,314,NAN
645,50,NAN,5495
458,200,NAN,346
25,250,53915,NAN
  1. 检查date-time 列 - 如果不匹配,则创建一个,然后通过用相应Idsdate-time-ref 值减去当前date-time value 来填充与Ids 相关的值。

  2. NAN 填充空白处,如果下一个文件具有该值,则用NAN 替换新值

如果是直列减法,它非常容易,但与 date-time series 同步,而相对于 Ids 似乎有点混乱。

首先欣赏一些建议。提前致谢。

【问题讨论】:

  • 你能添加你目前的代码吗?
  • 我可以直接列到列sub,但不能写关于idsdate-time

标签: python date pandas time


【解决方案1】:

这是一种方法。

import pandas as pd
import numpy as np
from StringIO import StringIO

# your csv file contents
csv_file1 = 'Ids,Date-time-1\n56,4568\n45,464\n'
csv_file2 = 'Ids,Date-time-2\n645,5545\n458,546\n'
# add a duplicated Ids record for testing purpose
csv_file3 = 'Ids,Date-time-1\n25,54165\n645, 4354\n'
csv_file_all = [csv_file1, csv_file2, csv_file3]

# read csv into df using list comprehension
# I use buffer here, replace stringIO with your file path
df_all = [pd.read_csv(StringIO(csv_file)) for csv_file in csv_file_all]


# processing
# =====================================================
# concat along axis=0, outer join on axis=1
merged = pd.concat(df_all, axis=0, ignore_index=True, join='outer').set_index('Ids')


  Out[206]: 
        Date-time-1  Date-time-2
   Ids                          
   56          4568          NaN
   45           464          NaN
   645          NaN         5545
   458          NaN          546
   25         54165          NaN
   645         4354          NaN

# custom function to handle/merge duplicates on Ids (axis=0)
def apply_func(group):
    return group.fillna(method='ffill').iloc[-1]

# remove Ids duplicates
merged_unique = merged.groupby(level='Ids').apply(apply_func)


  Out[207]: 
        Date-time-1  Date-time-2
   Ids                          
   25         54165          NaN
   45           464          NaN
   56          4568          NaN
   458          NaN          546
   645         4354         5545

# do the subtraction
master_csv_file = 'Ids,Date-time-ref\n56,100\n45,150\n645,50\n458,200\n25,250\n'
df_master = pd.read_csv(io.StringIO(master_csv_file), index_col=['Ids']).sort_index()

# select matching records and horizontal concat
df_matched = pd.concat([df_master,merged_unique.reindex(df_master.index)], axis=1)

# use broadcasting
df_matched.iloc[:, 1:] = df_matched.iloc[:, 1:].sub(df_matched.iloc[:, 0], axis=0)



   Out[208]: 
        Date-time-ref  Date-time-1  Date-time-2
   Ids                                         
   25             250        53915          NaN
   45             150          314          NaN
   56             100         4468          NaN
   458            200          NaN          346
   645             50         4304         5495

【讨论】:

  • 谢谢.. 但我有一个小要求。这些文件在另一个路径中,并且很多文件在某个确定的时间段内不断增加,而主文件在另一个路径中。你能解决这个问题吗?
  • @SitzBlogz。我不太明白。你可以用你的file path替换那些缓冲区io.StringIO(),它应该可以工作。
  • 谢谢 .. 我把它改写成类和函数模式
  • 很抱歉,但这对我不起作用。除了程序中的任何错误之外,他们可能有很多原因。我试图找到他们。将更新..我如何接受你的回答。
  • 仅供参考,我使用的是 Python 2.7 和 Pandas 0.16
猜你喜欢
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2012-11-23
  • 2013-01-16
  • 2014-07-25
  • 1970-01-01
相关资源
最近更新 更多