按日期

时间:2016-02-18 11:43:36

标签: r date split rpostgresql

我正在从数据库(test1)中读取一个大数据文件。数百万行我无法在R中直接阅读和处理。

我想基于“horodatage”列从这个大文件创建子文件。我在下面给出了一个示例,从大文件中提取一个文件,但现在我想在这两个日期之间为所有文件执行此操作。

拆分必须从此日期“23/03/2005 11:00”开始,一直到大文件的末尾(大约在“2005年12月31日23:59”左右(来自数据库的test1)和一个子文件的持续时间必须是30分钟(换句话说:每个子文件正好36000行)。

然后必须保存每个子文件,名称如(A200503231100.dat,A200503231130.dat,A200503231200.dat,A200503231230.dat等...)

列horodatage的格式已经

> class(montableau$horodatage)
[1] "POSIXct" "POSIXt" 

我开始使用的代码是:

heuredebut = "23/03/2005 11:00"
heurefin = "23/03/2005 11:30"
query = paste("select * from test1 where horodatage >= ",heuredebut," and horodatage < ",heurefin," order by horodatage;",sep="'")
montableau <- dbGetQuery (connection_db,query)

如果您对此大文件的循环有任何见解,那将非常有用。

1 个答案:

答案 0 :(得分:1)

R中的日期有点令人讨厌。

这里的关键技巧是使用strptime函数以您需要的方式格式化日期。

# Quick function to go from string to time
cleanDate <- function(x){
    as.POSIXct(strptime(x, '%d/%m/%Y %H:%M'))
}

# Function to print time in format of SQL database
printDate <- function(x){
    as.character(x, '%d/%m/%Y %H:%M')
}


# Create sequence of times
times <- seq(
    cleanDate('23/03/2005 11:00'), 
    cleanDate('01/01/2006 00:00'), 
    by = 60 * 30) # adding 30 minutes

for( i in 1:(length(times) - 1) ){

    # Generate SQL
    sql <- paste("select * from test1 where horodatage >= ", 
        printDate(times[i]),
        " and horodatage < ",
        printDate(times[i+1]),
        " order by horodatage;",sep="'")

    # Query
    montableau <- dbGetQuery (connection_db, sql)

    # Write table
    write.table(montableau, 
        file= as.character(times[i], 'A%Y%m%d%H%M.dat'), 
        row.names=FALSE, sep="\t", quote=FALSE)

}